像下面的示例一样在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
,但坦白地说,我找不到任何简单的解决方案。
有没有办法做到这一点?
答案 0 :(得分:2)
首先,不要将first_name
设置为主键。只需将默认主键保留为id
字段即可。主键必须是唯一的(first_name
不是唯一的),也不应该是用户输入的主键。
第二,的确,您不能强制CharField
在数据库级别不为空。但是您可以在代码级别执行它,这样,无论何时创建Django Form
并对其进行验证,它都会引发错误。
实际上,在您的情况下,Django会自动为您完成此操作。默认情况下,first_name
是required
字段,因为您没有设置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
,则不能将任何字段留空。它只是无法保存。