django Вставить или обновить запись - PullRequest
7 голосов
/ 19 июня 2020

вставка работает, но вводятся несколько данных, когда при попытке обновления вставляются два данных, запись не обновляется

Я просто хочу, чтобы, когда данные уже были записаны в базе данных, просто Обновить. если нет, он вставит

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 пробовал, вставка работает нормально, но обновление не работает

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

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


enter image description here

This is my html,

{% for relatedgroups in relatedgroups %}
 {% endfor%} {% для связанных групп в связанных группах%} {{relatedgroups.product}}  {% endfor%} {% для продукта в продуктах%} {{product.id}} - {{product}}  {% endfor%}      

при выборе данных или уже есть данные в базе данных, которые будут отображаться в Выбранный продукт поле

Ответы [ 2 ]

2 голосов
/ 15 августа 2020

Используйте метод update_or_create. Этот метод, если данные существуют, затем обновляет детали, еще недавно вставленные. Ссылка: 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)
1 голос
/ 18 августа 2020

Нам нужно сначала удалить все записи из ProductRelatedGroupAndProduct, используя related_ids (идентификаторы продуктов, которые уже были выбраны), а затем снова ввести ProductRelatedGroupAndProduct, используя product_ids (идентификаторы продуктов, которые выбраны).

Почему нам нужно удалить?

В ситуации, когда вы хотите удалить продукт из выбранного списка, обновление не удалит отношение. Чтобы удалить этот продукт из выбранного списка, нам нужно удалить это отношение (не продукт).

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...