Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django 对相关模型的属性设置约束_Django_Django Models_Constraints - Fatal编程技术网

Django 对相关模型的属性设置约束

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

我有两种型号:账户和转账。 模型账户具有货币属性(欧元、美元、日元等)。 模型传输有两个属性account\u from和account\u to。 我想添加一个约束,用于检查account_from是否使用与account_to相同的货币

我正在考虑对转移模型添加这样一个约束:

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'),
        ]