Как сохранить значение поля неизменным при обновлении объекта внешнего ключа в 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()
Думаю, у вас есть несколько вариантов, если я правильно понял ваш вопрос.
Либо вы можете сериализовать фактические данные о товаре при сохранении заказа. Это можно сделать, используя сериализацию Django serialization и затем сохраняя этот сериализованный продукт в заказе с помощью JSONField. Таким образом, вы сохраните состояние для товара, если захотите отобразить или использовать данные позже.
.Другим способом может быть хранение нового продукта с идентификатором версии, вместо обновления старых продуктов. Это можно сделать, подключив предварительное сохранение, создав новую версию и заблокировав сохранение старой модели. Таким образом, вы сохраните и сможете повторно использовать модель в своих шаблонах. https://docs.djangoproject.com/en/3.2/topics/signals/
Последней идеей будет использование исторической вставки модели, например django-simple-history. Это будет обрабатывать изменения и обновления для вас, но вам придется иметь отношение к данному экземпляру истории.