简体   繁体   English

在 Django 中更新或创建模型

[英]Update or create a model in django

I have a django table named Inventory我有一个名为 Inventory 的 Django 表

Models.py模型.py

class ClientInventory(models.Model):
    product_short_code = models.CharField(max_length=500, default=0, null=True)
    product_quantity = models.IntegerField(default=0, null=True)
    product_owner = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='inventory_owner')

and I want to update this inventory whenever a form named Delivered Docket is filled and this is my view to do that我想在填写名为 Delivered Docket 的表单时更新此库存,这是我的观点

Views.py视图.py

@method_decorator([login_required, employee_required], name='dispatch')
class DeliveredDocketFormView(CreateView):
    model = DeliveredDocket
    fields = "__all__"
    template_name = 'packsapp/employee/docketDeliveredForm.html'

    def form_valid (self, form):
        product = form.save(commit=False)
        product.save()

        data = form.cleaned_data

        ClientInventory.objects.update_or_create(product_short_code=data["product1"], product_quantity =data["product1_recieved_quantity"],
                                                 product_owner = data['created_for'])
        ClientInventory.objects.update_or_create(product_short_code=data["product2"],
                                                 product_quantity=data["product2_recieved_quantity"],
                                                 product_owner=data['created_for'])
        ClientInventory.objects.update_or_create(product_short_code=data["product3"],
                                                 product_quantity=data["product3_recieved_quantity"],
                                                 product_owner=data['created_for'])
        ClientInventory.objects.update_or_create(product_short_code=data["product4"],
                                                 product_quantity=data["product4_recieved_quantity"],
                                                 product_owner=data['created_for'])
        ClientInventory.objects.update_or_create(product_short_code=data["product5"],
                                                 product_quantity=data["product5_recieved_quantity"],
                                                 product_owner=data['created_for'])
        ClientInventory.objects.update_or_create(product_short_code=data["product6"],
                                                 product_quantity=data["product6_recieved_quantity"],
                                                 product_owner=data['created_for'])
        ClientInventory.objects.update_or_create(product_short_code=data["product7"],
                                                 product_quantity=data["product7_recieved_quantity"],
                                                 product_owner=data['created_for'])
        ClientInventory.objects.update_or_create(product_short_code=data["product8"],
                                                 product_quantity=data["product8_recieved_quantity"],
                                                 product_owner=data['created_for'])

        messages.success(self.request, 'The Delivered Docket was created with success!')
        return redirect('employee:delivered_docket_table')

How can I reduce the number of ORM calls as this does not feel right??我怎样才能减少 ORM 调用的次数,因为这感觉不对?

This is the form data:这是表格数据:

{'sender': <Warehouse: Yantra Gurgaon Warehouse>, 'pending_docket_list': <AllotmentDocket: Yantra Gurgaon Warehouse::client::2019-12-04>, 'material_received_date': datetime.date(2019, 12, 4), 'pod
_received': 'Yes', 'product1': 'Vipin', 'product1_alloted_quantity': 56, 'product1_recieved_quantity': 56, 'product2': None, 'product2_alloted_quantity': None, 'product2_recieved_quantity': None, 'product3': No
ne, 'product3_alloted_quantity': None, 'product3_recieved_quantity': None, 'product4': None, 'product4_alloted_quantity': None, 'product4_recieved_quantity': None, 'product5': None, 'product5_alloted_quantity':
 None, 'product5_recieved_quantity': None, 'product6': None, 'product6_alloted_quantity': None, 'product6_recieved_quantity': None, 'product7': None, 'product7_alloted_quantity': None, 'product7_recieved_quanti
ty': None, 'product8': None, 'product8_alloted_quantity': None, 'product8_recieved_quantity': None, 'created_on': datetime.datetime(2019, 12, 4, 18, 35, 29, tzinfo=<UTC>), 'created_for': <Client: client>, 'rema
rks': '65'}

Also when I enter the same short name in the form as I have entered previously with a different quantity instead of modifying it, it creates a new entry.此外,当我在表单中输入与之前输入的相同的短名称并使用不同的数量而不是修改它时,它会创建一个新条目。 What I want is that whenever someone enters the same short name then it should sum the new quantity with the previous quantity, How can I do that ?我想要的是,每当有人输入相同的短名称时,它应该将新数量与以前的数量相加,我该怎么做?

To reduce the number of ORM calls, why not do something like this -为了减少 ORM 调用的次数,为什么不做这样的事情 -

@method_decorator([login_required, employee_required], name='dispatch')
class DeliveredDocketFormView(CreateView):
    model = DeliveredDocket
    fields = "__all__"
    template_name = 'packsapp/employee/docketDeliveredForm.html'

    def form_valid (self, form):
        product = form.save(commit=False)
        product.save()

        data = form.cleaned_data
        count = 9
        for i in range(1, count):
                ClientInventory.objects.update_or_create(product_short_code=data["product"+str(i)],
                                                 product_quantity=data["product"+str(i)+"_recieved_quantity"],
                                                 product_owner=data['created_for'])

        messages.success(self.request, 'The Delivered Docket was created with success!')
        return redirect('employee:delivered_docket_table')

For your other problem, I would suggest first checking if you have that product and if you do, then modify it instead of creating it again.对于您的其他问题,我建议您首先检查您是否有该产品,如果有,则对其进行修改,而不是再次创建。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM