Как сохранить значение поля неизменным при обновлении объекта внешнего ключа в Django - Django?

В настоящее время я работаю над проектом Ecommerce на Django, где у меня есть модель Order, которая имеет отношение Foreign key с Product. Таким образом, все детали продукта извлекаются из модели продукта. Теперь я столкнулся с проблемой. Всякий раз, когда я вношу какие-либо изменения в объект Product, они обновляются и во всех связанных с ним объектах Order, даже для заказов, размещенных в прошлом.

Возможно ли сохранить значения товаров в прошлом заказе неизменными при каждом обновлении объекта Product в будущем? Пожалуйста, помогите. Ниже приведены коды для справки.

Модель изделия

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

Думаю, у вас есть несколько вариантов, если я правильно понял ваш вопрос.

  1. Либо вы можете сериализовать фактические данные о товаре при сохранении заказа. Это можно сделать, используя сериализацию Django serialization и затем сохраняя этот сериализованный продукт в заказе с помощью JSONField. Таким образом, вы сохраните состояние для товара, если захотите отобразить или использовать данные позже.

    .
  2. Другим способом может быть хранение нового продукта с идентификатором версии, вместо обновления старых продуктов. Это можно сделать, подключив предварительное сохранение, создав новую версию и заблокировав сохранение старой модели. Таким образом, вы сохраните и сможете повторно использовать модель в своих шаблонах. https://docs.djangoproject.com/en/3.2/topics/signals/

  3. Последней идеей будет использование исторической вставки модели, например django-simple-history. Это будет обрабатывать изменения и обновления для вас, но вам придется иметь отношение к данному экземпляру истории.

Вернуться на верх