在Django中强制模型字段

时间:2020-04-04 18:03:16

标签: django

像下面的示例一样在Django中创建模型时:

class Musician(models.Model):
    first_name = models.CharField(max_length=50, primary_key=True)
    last_name = models.CharField(max_length=50)
    instrument = models.CharField(max_length=100)

我注意到这种方法存在一些问题(不确定是否最好)。没有什么可以阻止您创建类似这样的内容:

musician = Musician()
musician.save()

有效地使primary_key的值等于None。我想强迫用户设置first_name,但坦白地说,我找不到任何简单的解决方案。

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

首先,不要first_name设置为主键。只需将默认主键保留为id字段即可。主键必须是唯一的(first_name不是唯一的),也不应该是用户输入的主键。

第二,的确,您不能强制CharField在数据库级别不为空。但是您可以在代码级别执行它,这样,无论何时创建Django Form并对其进行验证,它都会引发错误。

实际上,在您的情况下,Django会自动为您完成此操作。默认情况下,first_namerequired字段,因为您没有设置blank=True

因此,如果您这样做:

musician = Musician()
musician.full_clean()

这引起一个ValidationError

如果您为模型创建表单(如果要用户创建Musician,则需要此表单):

class MusicianForm(ModelForm):
    class Meta:
        model = Musician
        fields = '__all__'

form = MusicianForm(data={})
form.instance.first_name
# ''
form.is_valid()
# False
form.save()
# ValueError: The Musician could not be created because the data didn't validate.

您还将看到,如果您在Musician中为django管理站点注册了admin.py,则不能将任何字段留空。它只是无法保存。

相关问题