【问题标题】:Update an instance of a model in django such that the older instance and its relationship with other instances remain unaffected在 django 中更新模型的实例,使旧实例及其与其他实例的关系不受影响
【发布时间】:2020-10-12 16:52:49
【问题描述】:

我一直在从事电子商务项目。我有三个模型Item,OrderItem,Order。它们与 Foreignkey(s) (Item -> OrderItem -> Order) 链接。项目是实际产品,订单包含项目。

Item 基本上代表一个产品。在 Item 中有一个属性“price”,需要根据需要进行更新。比如在促销期间或其他什么时候。

发生的情况是,当我更新商品的价格时,该商品的价格也会在已完成的订单实例中更新。

基本上,我希望以某种方式分离这些模型,以使 Item 模型中的任何更改都不会影响已完成的 Orders。

class Item(models.Model):
    title = models.CharField(max_length=100)
    sku = models.CharField(max_length=8, validators=[
                           MinLengthValidator(8)], unique=True)
    upc = models.CharField(max_length=12, validators=[
                           MinLengthValidator(12)], unique=True, blank=True, null=True)
    date_updated = models.DateTimeField(
        auto_now=True, blank=True, null=True)
    price = models.FloatField()
    discount_price = models.FloatField(blank=True, null=True)
    category = models.CharField(choices=CATEGORY_CHOICES, max_length=2)
    label = models.CharField(choices=LABEL_CHOICES, max_length=1)
    slug = models.SlugField()
    description = models.TextField()
    image = models.ImageField(upload_to=upload_location, blank=True, null=True)
    stock_quantity = models.IntegerField(default=0)

class OrderItem(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    ordered = models.BooleanField(default=False)
    item = models.ForeignKey(Item, on_delete=models.CASCADE)
    item_variations = models.ManyToManyField(ItemVariation)
    quantity = models.IntegerField(default=1)
    purchase = models.FloatField(blank=True, null=True)


    def get_total_item_price(self):
        return self.quantity * self.item.price 

class Order(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    ref_code = models.CharField(
        max_length=20, blank=True, null=True, unique=True)
    items = models.ManyToManyField(OrderItem)
    start_date = models.DateTimeField(auto_now_add=True)
    # Check this
    ordered_date = models.DateTimeField()
    # When the payment is made it becomes True
    ordered = models.BooleanField(default=False)
    shipping_address = models.ForeignKey(
        'Address', related_name='shipping_address', on_delete=models.SET_NULL, blank=True, null=True)
    billing_address = models.ForeignKey(
        'Address', related_name='billing_address', on_delete=models.SET_NULL, blank=True, null=True)
    payment = models.ForeignKey(
        'Payment', on_delete=models.SET_NULL, blank=True, null=True)
    coupon = models.ForeignKey(
        'Coupon', on_delete=models.SET_NULL, blank=True, null=True)
    being_delivered = models.BooleanField(default=False)
    received = models.BooleanField(default=False)
    refund_requested = models.BooleanField(default=False)
    refund_granted = models.BooleanField(default=False)
    refund_refused = models.BooleanField(default=False)

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: django django-models django-shop


    【解决方案1】:

    您可以将ItemPrice 作为具有一对多关系的单独模型。该项目的哪些价格与相关日期更改一起存储。

    models.py

    class ItemPrice(models.Model):
        item = models.ForeignKey(Item, on_delete=models.CASCADE) 
        price = models.FloatField()
        date_changed = models.DateTimeField(auto_now=True, blank=True, null=True)
    

    然后将您的订单日期与当前时间的商品价格对齐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      相关资源
      最近更新 更多