Django:检查模型字段是不是已回答

Posted

技术标签:

【中文标题】Django:检查模型字段是不是已回答【英文标题】:Django: Check if Model Fields are answeredDjango:检查模型字段是否已回答 【发布时间】:2015-06-20 03:12:57 【问题描述】:

如果列表中的所有模型表单字段都设置了值,我的代码应该给我 True。如果一个或多个表单域没有被回答,它应该给我 False。

到目前为止我有这个:

fields_list = [field1, field2, field3]
if all(field != "" for field in fields_list) is True:
    return True
else:
    return False

这适用于简单的 CharFields,例如:

field1 = models.CharField('Field1', max_length=255, blank=True, null=True)

但它似乎不适用于带有预定义选择的 CharField:

CHOICES = (
    ('yes', 'yes'),
    ('no', 'no'),
)
field2 = models.CharField('Field2', choices=CHOICES, max_length=255, blank=True, null=True)

而且它似乎不适用于 DateFields 等。

谁能帮我找出如何检查各种模型表单字段的方法?

【问题讨论】:

只要将所有表单域设为required,在用户填写完所有表单域后,表单才会生效。默认情况下,如果您没有通过设置 null=Trueblank=True 将它们设为可选,则所有表单字段都是必需的。 感谢您的回答!不可能要求所有表单域。用户应该能够保存缺少字段的表单。我要做的是在缺少条目时显示“TODO”,如果所有字段都已填写,则显示“DONE”。 【参考方案1】:

虽然 OP 的答案朝着正确的方向发展,但我需要对其进行一些调整以使其正常工作并考虑我模型中的所有字段,而无需手动列出它们。这是我想出的:

class MyModel(models.model)
    # long list of fields here..

    def is_fully_filled(self):
        ''' Checks if all the fields have been filled '''
        fields_names = [f.name for f in self._meta.get_fields()]

        for field_name in fields_names:
            value = getattr(self, field_name)
            if value is None or value == '':
                return False

        return True

如果您需要将此值作为计算属性存储在数据库中(每次更改列表中的字段时都会自动更新),可以使用django-computed-property 轻松完成:

class MyModel(models.model)
    # long list of fields here..
    fully_filled = computed_property.ComputedBooleanField(
        compute_from='is_fully_filled', default=False)

    def is_fully_filled(self):
        ''' Checks if all the fields have been filled '''
        fields_names = [f.name for f in self._meta.get_fields()]

        for field_name in fields_names:
            if field_name == 'fully_filled':
                continue # avoid recursive calls to is_fully_filled

            value = getattr(self, field_name)
            if value is None or value == '':
                return False

        return True

【讨论】:

【参考方案2】:

我尝试了很多东西。最后,这个简单的解决方案似乎有效:

fields_list = [field1, field2, field3]
if any(field is None or field == '' for field in fields_list) is True:
    return False
else:
    return True

【讨论】:

这个答案可能是正确的,但它仍然需要开发者列出模型中包含的所有字段。如果您想自动检查模型中的所有字段,请查看我的答案!

以上是关于Django:检查模型字段是不是已回答的主要内容,如果未能解决你的问题,请参考以下文章

Django模型中的密码字段

如何检查 django 模型中的字段?

Django Rest Framework - 提交的数据不是文件。检查表单上的编码类型

Django 模板 - 检查字段中是不是有值,如果 ManyToManyField 则为空

如何使用 django 查询检查数据库字段的所有值是不是相同

Django:有没有办法序列化模型字段而不是模型?