【问题标题】:How to keep field value unchanged when foreign key object updated in Django - Django?在 Django - Django 中更新外键对象时如何保持字段值不变?
【发布时间】:2021-08-31 07:25:36
【问题描述】:

目前我正在 Django 中开展一个电子商务项目,其中我有一个与产品具有外键关系的订单模型。所以所有的产品细节都是从产品模型中获取的。现在我面临同样的问题。每当我对 Product 对象进行任何更改时,即使对于过去下的订单,它也会在所有相关的 Order 对象中更新。

是否可以在将来更新产品对象时保持过去订单的产品值不变?请帮忙。以下是供您参考的代码。

产品型号

class Product(models.Model):
measurement_choices = (('Liter', 'Liter'), ('Kilogram', 'Kilogram'), ('Cloth', 'Cloth'), 
('Shoe', 'Shoe'))
name = models.CharField(max_length=200)
sku = models.CharField(max_length=30, null=True)
stock = models.CharField(max_length=10, null=True)
measurement = models.CharField(choices=measurement_choices, max_length=20, null=True)
description = models.CharField(max_length=10000)
price = models.DecimalField(max_digits=7, decimal_places=2)
discounted_price = models.DecimalField(max_digits=7, decimal_places=2, null=True, blank=True)
image = models.ImageField(upload_to='product/images', default='product.png', null=True, 
blank=True)
image_one = models.ImageField(upload_to='product/images', null=True, blank=True)
image_two = models.ImageField(upload_to='product/images', null=True, blank=True)
image_three = models.ImageField(upload_to='product/images', null=True, blank=True)
image_four = models.ImageField(upload_to='product/images', null=True, blank=True)
image_five = models.ImageField(upload_to='product/images', null=True, blank=True)
tags = models.ManyToManyField(Tags)
category = models.ForeignKey(Category,on_delete=models.SET_NULL,null=True,blank=True)
sub_category = models.ForeignKey(SubCategory, on_delete=models.SET_NULL, 
null=True,related_name='+')
status = models.CharField(max_length=20, choices=(('Active', 'Active'), ('Inactive', 
'Inactive')))
brand = models.ForeignKey(Brand,on_delete=models.PROTECT,blank=True, null=True)
offer = models.ForeignKey(Offer, on_delete=models.CASCADE, null=True, blank=True)
color = models.ForeignKey(Color , blank=True, null=True , on_delete=models.PROTECT)
size_type = models.ForeignKey(Size , blank=True, null=True , on_delete=models.PROTECT)
history = HistoricalRecords()

订单模式

class Order(models.Model):
order_status = (('Pending', 'Pending'), ('Under Process', 'Under Process'), ('Dispatched', 
'Dispatched'),
                ('Delivered', 'Delivered'), ('Cancelled', 'Cancelled'), ('Out for delivery', 
'Out for delivery'))
customer = models.ForeignKey(Customer, on_delete=models.SET_NULL, null=True, blank=True)
shipping_address = models.ForeignKey(ShippingAddress, on_delete=models.DO_NOTHING, null=True, 
blank=True)
order_created = models.DateTimeField(auto_now_add=True,null=True)
date_ordered = models.DateTimeField(null=True)
complete = models.BooleanField(default=False)
transaction_id = models.CharField(max_length=100, null=True)
order_number = models.CharField(max_length=20, unique=True, null=True)
status = models.CharField(choices=order_status, default='Pending', max_length=30)
payment_status = models.CharField(choices=(('Received', 'Received'), ('Failed', 'Failed'), 
('Pending', 'Pending')),
                                  default='Pending', max_length=30)
ip_address = models.CharField(max_length=30, null=True)
# Payment details captured from payment gateway
payment_order_id = models.CharField(max_length=100, null=True) # razorpay order id
payment_id = models.CharField(max_length=100, null=True) # Razorpay payment id
payment_signature = models.CharField(max_length=100, null=True)# razorpay paymnet signature
payment_method = models.CharField(max_length=100, null=True)
history = HistoricalRecords()

【问题讨论】:

    标签: python python-3.x django django-models django-views


    【解决方案1】:

    如果我正确理解您的问题,我认为这里有几个选项可供您选择。

    1. 您可以在保存订单时序列化实际的产品详细信息。这可以通过使用Django serialization 来完成,然后使用JSONField 将此序列化产品存储在订单上。这样,如果您想稍后显示或使用数据,您就可以保留产品的状态。

    2. 另一种方法是使用版本 ID 存储新产品,而不是更新旧产品。这可以通过挂钩预保存、创建新版本并阻止保存旧模型来完成。这样您就可以在模板中存储并重用模型。 https://docs.djangoproject.com/en/3.2/topics/signals/

    3. 最后一个想法是使用历史模型插入,例如django-simple-history。这将为您处理更改和更新,但您必须与给定的历史实例相关联。

    【讨论】:

    • 我尝试在 JsonField 中保存序列化数据及其工作,但在模板中访问这些数据时遇到了困难。请帮忙
    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2021-10-25
    • 2013-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多