首页 > 解决方案 > if and or 运算符 django admin 模型

问题描述

我试图制作某种返回布尔值的逻辑函数“充足信息提供”。至于现在我是 python 语法的新手.. 如果有人能帮助解决这个问题,我将不胜感激,这是 django 应用程序中的模型

class FamilyMember(models.Model):
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
    family_group = models.ForeignKey(FamilyGroup,
                                on_delete=models.CASCADE,
                                null=True,
                                blank=True)
    name = models.CharField(max_length=100, null=True, blank=True)
    date_of_birth = models.DateField(null=True, blank=True)
    relationship = models.ForeignKey(Relationship, on_delete=models.PROTECT)
    dependant_child_age_range = models.ForeignKey(DependantChildAgeRange,
                                            null=True,
                                            blank=True,
                                            on_delete=models.PROTECT)
    care_percentage = models.PositiveSmallIntegerField(
        null=True, blank=True, validators=[
            MaxValueValidator(100),
        ]
    )
    income = models.DecimalField(max_digits=6,
                            decimal_places=2,
                            null=True,
                            blank=True)

这是同一个 .py 文件夹中的函数

@property
def sufficient_information_provided(self):
    b = ('Tenant', 'Partner')
    if (
        self.name and
        self.date_of_birth and
        self.relationship and(
            (
            self.relationship.name not in b and
                self.dependant_child_age_range
            ) or (
                self.relationship.name in b and
                self.income
            )
        ) 
    ): 
        return True
    return False

我想做的是:

它返回Trueelse 返回False

这是管理员的外观

标签: pythondjangoadmin

解决方案


为了代码清晰,您可以使用all和的组合any

  • allTrue如果可迭代的所有元素都返回,则返回True
  • anyTrue如果可迭代的至少一个元素返回,则返回True

所以你的函数——我只是复制了算法而没有质疑它——可能看起来像:

def sufficient_information_provided(self):
    b = ["Tenant", "Partner"]

    return all(
        [
            self.name,
            self.date_of_birth,
            self.relationship,
            any(
                [
                    (
                        self.relationship.name not in b
                        and self.dependant_child_age_range
                    ),
                    (self.relationship.name in b and self.income),
                ]
            ),
        ]
    )

推荐阅读