0

I am try to refer 'spot_price' of model 'Spot' in model 'Basis' in django model layer, How can I manage this?

I have designed view.py to automaticaly render the templates. so I am not able to modifty any view.py to choose data like 'models.B.objects.get().field'.

and more, str is set to indicate the date, so, in the django backstage admin, the 'spot' field display would be 'date' formate, how would be change to 'spot_price'?

model Spot

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 ''

need to refer the model Spot'spot_price by date, cause date is unique but spot_price is not

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(default=calculate_basis)

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

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

I expect the Basis.query.data would to like 'date: 2019-04-25, major_future_contract_close_price: 100.0, spot: 96.5, basis: 3.5'

4

1 回答 1

0

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

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

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

例如,我正在覆盖save()计算basis字段。我将其设置为editable=False,这意味着默认情况下它不会出现在表单中(并且您将无法在管理员中看到它!)。如果您只想查看值,则可以安全地删除该部分。另外我添加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)

至于Spotstr repr,我认为不可能根据引用的位置来更改它。如果你想使用spot_price,你可以使用:return str(self.spot_price) if self.spot_price else str(self.date)

于 2019-04-25T05:28:49.187 回答