Django插入或更新记录

2024-06-02 17:54:43 发布

您现在位置:Python中文网/ 问答频道 /正文

插入有效,但输入多个数据,当我尝试更新时插入两个数据时,它不会更新记录

我只希望当数据已经在数据库中有记录时,只需更新。如果没有,它将插入

def GroupOfProduct(request):
    global productOrderList
    relatedid_id = request.POST.get("relatedid")
    groups = ProductRelatedGroup(id=id)
    productOrderList=[]
    try:
        for products_id in request.POST.getlist("product"):
            products = Product(id=products_id)
            insert_update_groupofproduct = ProductRelatedGroupAndProduct(
                product = products
            )
            insert_update_groupofproduct.save()
    except ProductRelatedGroupAndProduct.DoesNotExist:
        for products_id in request.GET.getlist("relatedid"):
            products = Product(id=products_id)
            insert_update_groupofproduct = ProductRelatedGroupAndProduct.objects.get(id=products)
            insert_update_groupofproduct.product = products
            insert_update_groupofproduct.save()
    return redirect(relatedgroup)

这是我的模特

class Product(models.Model):
    product = models.CharField(max_length=500)

class ProductRelatedGroup(models.Model):
    category = models.CharField(max_length=500, blank=True)

class ProductRelatedGroupAndProduct(models.Model):
    productrelatedgroup = models.ForeignKey(ProductRelatedGroup,on_delete=models.SET_NULL, null=True, blank=True,verbose_name="Product Related Group")
    product = models.ForeignKey(Product,on_delete=models.SET_NULL, null=True, blank=True,verbose_name="Product")

更新

我尝试了这个,插入工作正常,但更新不起作用

def GroupOfProduct(request):
    global productOrderList
    groups = ProductRelatedGroup(id=id)

    idproduct = request.POST.get('relatedid')

    if ProductRelatedGroupAndProduct.objects.filter(id=idproduct).exists():
        print("update")
        for products_id in request.GET.getlist("relatedid"):
                products = Product(id=products_id)
                insert_update_groupofproduct = ProductRelatedGroupAndProduct.objects.get(id=products)
                insert_update_groupofproduct.product = products

                insert_update_groupofproduct.save()
                return redirect(relatedgroup)
    else:

        productOrderList = []
        for isa in request.POST.getlist('relatedid'):
            productOrderList.append(isa)
        i = 0
        for i in productOrderList:
            for products_id in request.POST.getlist("product"):
                products = Product(id=products_id)
                insert_update_groupofproduct = ProductRelatedGroupAndProduct(
                    productrelatedgroup=groups,
                    product=products
                )
                insert_update_groupofproduct.save()
            return redirect(relatedgroup)
    return redirect(relatedgroup)

我的程序流程(附图片)

enter image description here

当管理员用户插入数据时(如下所示)

enter image description here批量插入工作非常好

当我尝试更新时(批量更新)

enter image description here

只更新了一个数据

enter image description here

当我再次尝试插入时(就像这样)

enter image description here

没有结果

插入

<QueryDict: {'csrfmiddlewaretoken': ['F3evgRJwNw4p5XCOVE0qeFhP3gmGG5ay4GBbpoZQg3P5l6TNXHY7KN2lD56s6NCU'], 'relatedid': ['200', '201']}>

enter image description here

这是我的html

{% for relatedgroups in relatedgroups %}
<input type="hidden" name="relatedid" value="{{relatedgroups.id}}">
{% endfor %}
<fieldset class="module aligned ">
        <div class="form-row field-user_permissions">
            <div>
                <div class="related-widget-wrapper">
                    <select name="product" id="id_user_permissions" multiple class="selectfilter" data-field-name="Product" data-is-stacked="0">
                        {% for relatedgroups in relatedgroups %}
                        <option value="{{relatedgroups.product.id}}" selected>{{relatedgroups.product}}</option>
                        {% endfor %}
                        {% for product in products %}
                        <option value="{{product.id}}">{{product.id}}-{{product}}</option>
                        {% endfor %}
                    </select>
                </div>
                </div>
        </div>
</fieldset>

当数据被选中或数据库中已有数据时,它将显示在所选产品框中


Tags: 数据inidformodelsrequestupdateproduct
2条回答

我们需要首先使用related_ids(已选择的产品ID)从ProductRelatedGroupAndProduct中删除所有记录,然后使用product_ids(已选择的产品ID)再次进入ProductRelatedGroupAndProduct

为什么我们需要删除

如果要从所选列表中删除产品,则更新不会删除该关系。为了从所选列表中删除该产品,我们需要删除该关系(而不是该产品)

def GroupOfProduct(request):
    related_ids = request.POST.getlist('relatedid')
    product_ids = request.POST.getlist("product")

    # delete the existing ProductRelatedGroupAndProduct entries
    for product_id in related_ids:
        product = Product.objects.filter(id=product_id).first()
        obj = ProductRelatedGroupAndProduct.objects.get(product = product)
        obj.delete()

    # create new records in ProductRelatedGroupAndProduct with the selected product_ids
    for product_id in product_ids:
        product = Product.objects.filter(id=product_id).first()
        obj = ProductRelatedGroupAndProduct(
            product = product,
        )
        obj.save()

请使用update_or_create方法。如果存在数据,则使用此方法更新新插入的详细信息。 参考: https://www.kite.com/python/docs/django.db.models.QuerySet.update_or_createhttps://djangosnippets.org/snippets/1114/

def GroupOfProduct(request):
    group_id = request.POST.get('group')
    groups = ProductRelatedGroup(id=group_id)
    idproduct = request.POST.get('product')
    for products_id in request.POST.getlist("product"):
        products = Product(id=products_id)
    ProductRelatedGroupAndProduct.objects.update_or_create(id=idproduct,defaults={'product':products,'productrelatedgroup':groups})  
    return redirect(relatedgroup)

相关问题 更多 >