我有两个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_currency
和Pair.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}'