【问题标题】:Django. Default value from foreign key姜戈。外键的默认值
【发布时间】:2016-04-25 07:26:42
【问题描述】:

我使用 Django 1.9.1、Python 3.5。 models.py:

class Item(models.Model):
    name = models.CharField(max_length=200)
    price = models.FloatField()
    def __str__(self):              # __unicode__ on Python 2
        return self.name

class Lot(models.Model):
    item = models.ForeignKey(Item)
    count = models.IntegerField(default = 1)
    price = models.FloatField(default = 1) #Price on the moment of buying
    def __str__(self):              # __unicode__ on Python 2
        return self.item.name

    def cost(self):
         return self.price * self.count

我想用默认的 price = item.price 创建 Lot 对象。 IE。购买时的价格。所以我无法从 Lot.item.price 获得price 值,因为它可能不同。当models.py的代码是这样的:

class Lot(models.Model):
    item = models.ForeignKey(Item)
    count = models.IntegerField(default = 1)
    price = models.FloatField(default = item.price) #Price on the moment of buying
    def __str__(self):              # __unicode__ on Python 2
        return self.item.name

    def cost(self):
         return self.price * self.count

我收到以下错误:

AttributeError: 'ForeignKey' object has no attribute 'price'

我应该如何更正此代码?

【问题讨论】:

    标签: python django django-models foreign-keys


    【解决方案1】:

    您的模型定义中的default 不是“实例感知”。我建议覆盖Lot 的保存方法,以便在保存时获取价格。

    class Lot(models.Model):
    
        item = models.ForeignKey(Item)
        count = models.IntegerField(default = 1)
        price = models.FloatField(default = item.price) #Price on the moment of buying
        def __str__(self):              # __unicode__ on Python 2
            return self.item.name
    
        def save(self, *args, **kwargs):
            if self.item: # verify there's a FK
                self.price = self.item.price
            super(Lot, self).save(*args,**kwargs) # invoke the inherited save method; price will now be save if item is not null
    
        def cost(self):
             return self.price * self.count
    

    【讨论】:

      【解决方案2】:

      您应该覆盖 Lot.save 以设置价格的默认值。

      class Lot(models.Model):
          item = models.ForeignKey(Item)
          price = models.FloatField()
          ....
      
          def save(self, *args, **kwargs):
              if not self.price:
                  self.price = self.item.price
              super(Lot, self).save(*args, **kwargs)
      

      【讨论】:

        猜你喜欢
        • 2019-01-04
        • 2014-07-20
        • 2010-12-21
        • 2020-08-17
        • 2012-05-29
        • 2012-11-10
        • 2014-06-25
        • 2018-01-23
        • 2011-12-14
        相关资源
        最近更新 更多