Django 对相关模型的属性设置约束
我有两种型号:账户和转账。 模型账户具有货币属性(欧元、美元、日元等)。 模型传输有两个属性account\u from和account\u to。 我想添加一个约束,用于检查account_from是否使用与account_to相同的货币 我正在考虑对转移模型添加这样一个约束:Django 对相关模型的属性设置约束,django,django-models,constraints,Django,Django Models,Constraints,我有两种型号:账户和转账。 模型账户具有货币属性(欧元、美元、日元等)。 模型传输有两个属性account\u from和account\u to。 我想添加一个约束,用于检查account_from是否使用与account_to相同的货币 我正在考虑对转移模型添加这样一个约束: class Meta: constraints = [ CheckConstraint(check=Q(account_from__currency=F('account_to__cur
class Meta:
constraints = [
CheckConstraint(check=Q(account_from__currency=F('account_to__currency')), name='same_currency'),
]
但由于错误,这不起作用
django.core.exceptions.FieldError: Joined field references are not permitted in this query
我该怎么做?不依赖SQL。我知道如何在SQL中实现这一点,但我想使用ORM。或者用Django ORM是不可能做到的
以下是两个模型(简化以避免噪音):
您应该将该约束添加到货币模型中,而不是帐户模型中。doc:3.1@minglyu版本中添加了对
布尔表达式的支持,虽然这很有趣,但它没有解决问题,或者我遗漏了什么?挖掘之后,似乎根本不可能使用CheckConstraint,因为在SQL检查中也不可能。目前我找到的解决方案是使用pre_save,在这里我可以根据自己的喜好浏览关系。相关:你应该将该约束添加到货币模型中,而不是帐户模型中。doc:3.1@minglyu版本中添加了对布尔表达式的支持,虽然这很有趣,但它没有解决问题,或者我遗漏了什么?挖掘之后,似乎根本不可能使用CheckConstraint,因为在SQL检查中也不可能。目前我找到的解决方案是使用pre_save,在这里我可以根据自己的喜好浏览关系。相关:
class Tranfer(AuditedModel):
"""
The action of moving money from one account to another
"""
account_from = models.ForeignKey(Account, related_name="outgoing", on_delete=models.CASCADE)
account_to = models.ForeignKey(Account, related_name="incoming", on_delete=models.CASCADE)
class Account(AuditedModel):
"""
Recipient for money
"""
currency = models.CharField('currency', max_length=3, choices=(('EUR', 'Euro'), ('USD', 'American Dollars'), ('JPY', 'Japan Yen')))
class Meta:
constraints = [
CheckConstraint(check=Q(account_from__currency=F('account_to__currency')), name='same_currency'),
]