如果和或运算符 django 管理模型

If and or operator django admin models

我正在尝试创建某种逻辑函数“sufficient_information_provided”,其中 returns 是布尔值。至于现在我是 python 语法的新手.. 如果有人能帮助解决这个问题,我将不胜感激,这是 django app

中的模型
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

我想做的是:

它returnsTrue其他returnsFalse.

here is how the admin looks.

为了代码清晰,您可以使用 allany 的组合:

  • all 将 return True 如果 iterable return True.
  • 的所有元素
  • any 将 return True 如果 iterable returns 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),
                ]
            ),
        ]
    )