我尝试在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'
答案 0 :(得分:0)
您不能使用默认的类方法,因为它需要self
,当您仍在创建对象时该方法不存在。
如果需要将其存储在字段(数据库)中,创建对象后,override default save()
method或使用signals
修改basis
字段。另外请注意,每次close_price
或spot_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)