在djang中更新或创建模型

2024-10-01 09:26:22 发布

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

我有一个名为Inventory的django表

型号.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')

每当一个名为delivereddocket的表单被填充时,我想更新这个清单,这是我的观点

视图.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')

我怎样才能减少ORM调用的次数,因为这感觉不对

这是表单数据:

{'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'}

另外,当我在表单中输入与我之前输入的相同的短名称,而不是修改它时,它会创建一个新条目。 我想要的是,每当有人输入相同的短名称,那么它应该总和新的数量与以前的数量,我怎么做呢


Tags: ornonefordataobjectscreatecodeupdate
1条回答
网友
1楼 · 发布于 2024-10-01 09:26:22

为了减少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')

对于您的另一个问题,我建议首先检查您是否有该产品,如果有,然后修改它,而不是再次创建它

相关问题 更多 >