Django中的力模型场
在Django中创建模型时,如以下示例所示:Django中的力模型场,django,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) 我注意到这种方法存在一些问题(不确定这是否是最好的词)。没有任
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()
有效地使主键
值等于无
。我想强制用户设置名字
,但坦率地说,我找不到任何简单的解决方案
有没有办法做到这一点?首先,不要将
名字设置为主键。只需将默认主键保留为id
字段。主键必须是唯一的(名不是),并且不应该是用户输入的
其次,确实不能在数据库级别强制CharField
不为空。但是您可以在代码级别强制执行它,这样,无论何时创建Django表单并对其进行验证,它都会引发错误
事实上,Django在您的情况下会自动为您执行此操作。默认情况下,first\u name
是一个必填字段,因为您没有设置blank=True
因此,如果你这样做:
musician = Musician()
musician.full_clean()
这将引发一个验证错误
如果为模型创建表单(如果希望用户创建音乐家
,则需要该表单):
您还将看到,如果在django admin站点的admin.py
中注册music
,则不能将任何字段留空。它不会保存。首先,不要将名字设置为主键。只需将默认主键保留为id
字段。主键必须是唯一的(名不是),并且不应该是用户输入的
其次,确实不能在数据库级别强制CharField
不为空。但是您可以在代码级别强制执行它,这样,无论何时创建Django表单并对其进行验证,它都会引发错误
事实上,Django在您的情况下会自动为您执行此操作。默认情况下,first\u name
是一个必填字段,因为您没有设置blank=True
因此,如果你这样做:
musician = Musician()
musician.full_clean()
这将引发一个验证错误
如果为模型创建表单(如果希望用户创建音乐家
,则需要该表单):
您还将看到,如果在django admin站点的admin.py
中注册music
,则不能将任何字段留空。它就是不会保存。是的,我知道名字
是个愚蠢的选择,但它只是为了举例。事实上,我将使用另一个模型的OneToOne
映射字段。至于形式,最好知道。但这只适用于形式。如果我想在单元测试中检查模型,我不能。无论如何,感谢您对表单的澄清。在您的单元测试中,您应该在模型上使用full\u clean()
方法来检查它是否有效。是的,我知道first\u name
是一个愚蠢的选择,但这只是出于示例目的。事实上,我将使用另一个模型的OneToOne
映射字段。至于形式,最好知道。但这只适用于形式。如果我想在单元测试中检查模型,我不能。无论如何,感谢您对表单的澄清。在单元测试中,您应该在模型上使用full\u clean()
方法来检查它是否有效。