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) 我注意到这种方法存在一些问题(不确定这是否是最好的词)。没有任

在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()
有效地使
主键
值等于
。我想强制用户设置
名字
,但坦率地说,我找不到任何简单的解决方案


有没有办法做到这一点?

首先,不要将
名字设置为主键。只需将默认主键保留为
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()
方法来检查它是否有效。