Django-使用可从其他模型派生的字段创建模型



我有两个Django模型来表示coin域。硬币有一些属性,交易对基于这些属性。

class Coin(models.Model):
code = models.CharField(max_length=8, primary_key=True)
name = models.CharField(max_length=32) 
class Pair(models.Model):
code = models.CharField(max_length=16, primary_key=True)
name = models.CharField(max_length=64)
base_currency = models.ForeignKey(Coin, on_delete=models.CASCADE, null=False, related_name='base_currency')
quote_currency = models.ForeignKey(Coin, on_delete=models.CASCADE, null=False, related_name='quote_currency')

让我们添加几个Coin实例:

first = Coin.objects.create(code="BTC", name="Bitcoin")
second = Coin.objects.create(code="USD", name="United States Dollar")

和一对:

Pair.objects.create(code="BTCUSD", name="Bitcoin / United States Dollar", base_currency=first, quote_currency=second)

如您所见,模型中的代码名称可以从Coin模型中的代码和名称派生。简单地说:

  • 对码=第一个硬币码+第二个硬币码
  • 对名称=第一个硬币名称+"/"+第二个硬币名称

但是,在这个例子中,我只是对这些值进行了硬编码,当然这不是处理这种情况的最佳方式。例如:如果在Coin模型中,我需要更改实例的名称,该怎么办?然后,我将不得不手动更新Pair模型中的代码名称,因为这些值没有从Coin模型中正确绑定。

我认为Pair代码/名称必须以某种方式绑定/派生自Coin模型。

在Django有办法做到这一点吗?

您可能不需要存储Pair的名称,因为它可以从Pair.base_currencyPair.quote_currency的引用中推断出来。

Pair类上的一个属性应该足够了:

class Pair(models.Model):
base_currency = models.ForeignKey(Coin, on_delete=models.CASCADE, null=False, related_name='base_currency')
quote_currency = models.ForeignKey(Coin, on_delete=models.CASCADE, null=False, related_name='quote_currency')
@property
def code(self) -> str:
return self.base_currency.code + self.quote_currency.code
@property
def name(self) -> str:
return f'{self.base_currency.name} / {self.quote_currency.name}'

最新更新