Python 从模型中更改或删除主键(实例)后如何保持相同的数据

Python 从模型中更改或删除主键(实例)后如何保持相同的数据,python,django,model,Python,Django,Model,我希望在更改或删除提供外键的模型之前、之后或之前保存的数据保持不变 我试着 on_delete=models.SET_NULL 但是仍然删除了我以前保存的实例 class Product(models.Model): product_name = models.CharField(unique=True, max_length=50 , blank=False,null=False) price = models.PositiveIntegerField()

我希望在更改或删除提供外键的模型之前、之后或之前保存的数据保持不变

我试着

on_delete=models.SET_NULL
但是仍然删除了我以前保存的实例

class Product(models.Model):
    product_name = models.CharField(unique=True, max_length=50 , 
    blank=False,null=False)
    price = models.PositiveIntegerField()
    active = models.BooleanField(default=True)

    def __str__(self):
        return self.product_name


class Order(models.Model):
    id = models.AutoField(primary_key = True)
    products = models.ManyToManyField(Product ,through='ProductOrder')
    date_time = models.DateTimeField(default=datetime.now()) 


    @property
    def total(self):
        return self.productorder_set.aggregate(
            price_sum=Sum(F('quantity') * F('product__price'), 
            output_field=IntegerField()) )['price_sum'] 


class ProductOrder(models.Model):
    product = models.ForeignKey(Product, on_delete=models.SET_NULL , null=True)
    ordering = models.ForeignKey(Order, on_delete=models.SET_NULL,blank=True,null=True ,default='')
    quantity = models.PositiveIntegerField(default=1)

    def __str__(self):
        return f"{self.product} : {self.quantity}"
如何在变量中保存总价格,如果产品中的价格更新,它仍然是第一次


以及如何防止从产品模型中删除产品后从订单模型中丢失数据感谢您的建议有多种方法可以解决此问题,但通常与Django本身无关,因为这些都是业务决策:

不要链接到订单和ProductOrder模型中的产品,而是直接将产品信息保存在ProductOrder模型中。例如,如果使用PostgreSQL,可以使用JSONField,并将所有产品详细信息(包括价格)保存在那里

一旦产品订购一次,就不要更换。i、 e.您可以在_delete=models.PROTECT上使产品无法更改/删除。为产品提供唯一的SKU和版本号,并在价格变化时创建产品的新版本。这样,所有订单都将引用实际订购的产品。获取可以购买的产品时,始终获取产品的最新版本。您可以为此创建一个新的ProductVersion表,并链接到该表而不是产品

不允许在_delete=PROTECT上删除产品,但允许更改价格。请注意,如果产品的其他特性(如颜色)发生变化,则应始终创建新产品。在ProductOrder本身(订单的行项目)中保留一份已付价格的副本。这是最常见的方法。您只需复制行项目中的价格,这样您就可以始终获得客户支付的实际价格


您选择的解决方案在一定程度上取决于您公司的业务需求,即产品的管理方式、需要保留的内容等。。。这还取决于您希望您的客户在查找历史订单时能够看到什么。

非常感谢,但请您再解释一下第三种方法!如何在产品订单中保持价格?在ProductOrder中创建一个名为price的新字段?我不想每次都键入价格。是的,在ProductOrder中添加一个已付价格字段,并在分配数量时分配它。“打字”是什么意思?您只需在创建ProductOrder实例的同一位置进行分配。我的意思是,我不想在结算表单时提供价格,我只想从产品中获取默认价格,我将尝试第二个选项,将ProductVersionmodels.Model:product=models.ForeignKeyProduct分类,在_delete=models.PROTECT code=models.IntegerFieldunique=True price=models.PositiveIntegerField active=models.booleanfield default=True上,我认为这将解决我的问题,再次感谢,代码字段类似于条形码,应该是唯一的,但这不是我在选项3中建议的。价格仍然来自产品,您只需将其复制到ProductOrder,以便在以后产品价格发生变化时,订单上仍然存在支付价格。是否使用保存方法提供默认价格?