参考模型层中的相关模型字段

时间:2019-04-25 04:46:55

标签: python django model foreign-keys one-to-one

我尝试在Django模型层的“基础”模型中引用模型“现货”的“现货价格”,该如何管理?

我设计了view.py来自动呈现模板。因此我无法修改任何view.py来选择“ models.B.objects.get()。field”之类的数据。

更多, str 设置为指示日期,因此,在django后台管理员中,“ spot”字段显示为“ date”格式,如何更改为“ spot_price” ?

模特现场

classroom_user

需要按日期引用模型的竞价价格,因为日期是唯一的,但竞价价格不是

class Spot(models.Model):
    date = models.DateField(primary_key=True)
    spot_price = models.FloatField(blank=True, null=True)

    def __str__(self):
        return str(self.date) if self.date else ''

我希望Basis.query.data会喜欢'日期:2019-04-25,major_future_contract_close_price:100.0,现货:96.5,基数:3.5'

1 个答案:

答案 0 :(得分:0)

您不能使用默认的类方法,因为它需要self,当您仍在创建对象时该方法不存在。

如果需要将其存储在字段(数据库)中,创建对象后,override default save() method或使用signals修改basis字段。另外请注意,每次close_pricespot_price更改时都必须重新计算基础,因为该值只是写入数据库中。

可能更好的解决方案是使用@property,因此对于将要使用您建模的任何人来说,它看起来都像一个字段,但是它将根据当前数据动态地计算值。

例如,我重写save()来计算basis字段。我将其设置为editable=False,这意味着默认情况下它不会出现在表单中(并且您将无法在admin中看到它!)。如果您只想查看这些值,则可以安全地删除该部分。 另外,我添加了basis_as_property属性。

class Basis(models.Model):
    date = models.DateField(primary_key=True)
    major_future_contract_close_price = models.FloatField(blank=True)
    spot = models.OneToOneField(Spot, on_delete=models.CASCADE)
    basis = models.FloatField(editable=False, blank=True)

    @property
    def basis_as_property(self):
        return '%s' % (self.calculate_basis())

    def __str__(self):
        return str(self.date) if self.date else ''

    def save(self, *args, **kwargs):
        if not self.basis:
            self.basis = self.calculate_basis()
        super(Basis, self).save(*args, **kwargs)

    def calculate_basis(self):
        return abs(self.major_future_contract_close_price - self.spot.spot_price)

对于Spot str repr,我认为不可能根据引用位置进行更改。如果您想使用spot_price,则可以使用:return str(self.spot_price) if self.spot_price else str(self.date)