user12951147
user12951147

Reputation:

django Insert or Update record

the insert works but multiple data enters, when two data are inserted when I try to update, it does not update the record

I just want that when the data is already have record in the database, just update. if not, it will insert

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)

this is my models.py

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")

UPDATE

I tried this, the insert works fine, but the update does not work

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)

FLOW OF MY PROGRAM (with picture)

enter image description here

when the admin-user Insert data just (like this)

enter image description here the batch insert work perfectly fine

and when i tried to update (batch update)

enter image description here

only one data updated

enter image description here

and when i tried to insert again (just like this)

enter image description here

no result

In Insert

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

enter image description here

This is my 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>

when the data is selected or already have data in the database it will shows in Chosen Product box

Upvotes: 10

Views: 8308

Answers (2)

Achuth Varghese
Achuth Varghese

Reputation: 2451

We need to delete all the records first from ProductRelatedGroupAndProduct using the related_ids (product ids which were already selected) and then enter again into ProductRelatedGroupAndProduct using product_ids (product ids which are selected).

Why we need to delete ?

In a situation where you want to remove a product from the selected list, an update would not delete the relation. In-order to remove that product from the selected list we need to delete that relation (not the Product).

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()

Upvotes: 0

Riyas Ac
Riyas Ac

Reputation: 1613

Please use update_or_create method. This method if a data is exist then updated the details else newly inserted. Reference: https://www.kite.com/python/docs/django.db.models.QuerySet.update_or_create https://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)

Upvotes: 8

Related Questions