通过Django中的模型实例变量迭代



考虑一个定义如下的模型:

class ProblemVerificationModel(CreateUpdateDateModel):
    problem = models.ForeignKey(Problem, related_name="problem_survey")
    verifier = models.ForeignKey(settings.AUTH_USER_MODEL, related_name="verified_problem")
    is_problem_properly_formated = ... # BooleanField
    some_field = ... #BooleanField
    some_other_field = ... #BooleanField

我需要找到ProblemVerificationModel模型实例的所有类似整数的值(True-> 1,False-> 0(的总和。我可以通过使用instance.field访问每个字段并将它们添加全部添加这些值。但是,我想知道是否有更多干净的方法。

我想编写一种方法,它会更加pythonic。除非有必要,否则我不会使用动态列表来使用该字段,因为您不会经常更改模型。

class ProblemVerificationModel(CreateUpdateDateModel):
    ...
    is_problem_properly_formated = ... # BooleanField
    ...
    def get_bool_sum(self):
        bool_fields = (
            'is_problem_properly_formated',
            'some_field',
            'some_other_field',
        )
        return sum(bool(getattr(self, field)) for field in bool_fields)

您可以使用模型的元API,以动态收集所有Integer-BooleanFields以及其子类型:

class ProblemVerificationModel(CreateUpdateDateModel):
    #...
    def int_sum(self):
        return sum(
            getattr(self, f.name) or 0 for f in self._meta.get_fields() 
            if isinstance(f, (IntegerField, BooleanField))
        )

最新更新