Django模型- 替代重复的null=True, blank=True

3

我有许多Django模型中的非必填字段。是否有替代方案来避免使用null=Trueblank=True?是否有类似于blank_fields=('email','image',)null_fields=('email','image')这样的东西?


1
这些字段是CharField吗?如果是,那么您应该重新考虑仅使用blank=True。您的想法可能看起来很好,但实际上并没有带来优势。这只是将约束规范外包给另一个应用程序部分,使您的代码不太可读。 - cezar
是的,你说得对。在这里可读性比方便更重要。 - Stuxen
2个回答

3
不,Django没有像“blank_fields”或“null_fields”这样的选项。您可以子类化字段以创建可选版本,例如“OptionalCharField”,但我建议不要这样做。虽然它可能比重复使用“blank=True,null=True”更少,但它对于查看代码的其他Django开发人员来说会更难读懂。正如Cezar在评论中建议的那样,通常不应该为CharField使用“null=True”,因为这意味着您有两个空值,“''”和“None”。

非常感谢!它可以工作,但我同意 blank=true 和 null=true 更好。 - Stuxen

2

默认情况下Django没有提供任何属性。这些属性是针对每个字段定义的,而不是模型级别的。您可以使用unique_togetherindex_together等定义来组合不同字段的模型级定义。

一种方法是通过子类化字段并提供默认定义:

class CustomIntegerField(models.IntegerField):
    def __init__(self, *args, **kwargs):
        kwargs['blank'] = True
        kwargs['null'] = True
        super(CustomIntegerField, self).__init__(**kwargs)


class Test(models.Model):
    cus = CustomIntegerField(default=0) 

迁移:

class Migration(migrations.Migration):

    dependencies = [ ]

    operations = [
        migrations.CreateModel(
            name='Test',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('cus', test.models.CustomIntegerField(blank=True, default=0, null=True)),
            ],
        ),
    ]

你可以为其他领域执行同样的操作。

非常感谢!它有效。但是出于可读性的考虑,我将坚持使用null=True和blank=True。 - Stuxen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接