Django中forms.ChoiceField的模型定义是什么?
我制作了一个包含如下字段的表单:Django中forms.ChoiceField的模型定义是什么?,django,django-models,Django,Django Models,我制作了一个包含如下字段的表单: sex = forms.ChoiceField(choices= SEX) 其中: SEX = ( ('F','Female'), ('M','Male'), ('U','Unsure'), ) 现在我想知道如何最好地定义模型中的性别字段?我知道可以这样做: class UserProfile(models.Model): user = models.ForeignKey('User') sex = model
sex = forms.ChoiceField(choices= SEX)
其中:
SEX = (
('F','Female'),
('M','Male'),
('U','Unsure'),
)
现在我想知道如何最好地定义模型中的性别字段?我知道可以这样做:
class UserProfile(models.Model):
user = models.ForeignKey('User')
sex = models.CharField(max_length=10)
但难道没有比查菲尔德更好的选择吗 您已经将选择设置为字符串,因此它应该是模型中的
字符域(max_length=1,choices=SEX)
。然后,您可以使用,而不是以单独的形式重复所有逻辑。例如:
# models.py
class MyModel(models.Model):
SEX_CHOICES = (
('F', 'Female',),
('M', 'Male',),
('U', 'Unsure',),
)
sex = models.CharField(
max_length=1,
choices=SEX_CHOICES,
)
# forms.py
class MyForm(forms.MyForm):
class Meta:
model = MyModel
fields = ['sex',]
您已经将选择设置为字符串,因此它应该是模型中的
CharField(max_length=1,choices=SEX)
。然后,您可以使用,而不是以单独的形式重复所有逻辑。例如:
# models.py
class MyModel(models.Model):
SEX_CHOICES = (
('F', 'Female',),
('M', 'Male',),
('U', 'Unsure',),
)
sex = models.CharField(
max_length=1,
choices=SEX_CHOICES,
)
# forms.py
class MyForm(forms.MyForm):
class Meta:
model = MyModel
fields = ['sex',]
我更喜欢这种方式,它更容易引用代码中的选项
UserProfile.objects.filter(sex__exact=UserProfile.SEX_UNSURE)
我更喜欢这种方式,它更容易引用代码中的选项
UserProfile.objects.filter(sex__exact=UserProfile.SEX_UNSURE)
模型字段应表示选择值的类型;在您的案例中,您的选择是字符
'F',M',U'
,因此您的模型应该具有性别=模型。CharField(max_length=1)
-这就是您要问的问题吗?嗯,我认为在这个场景中可能有比CharField更好的选择。(在DB查询方面更好)字符字段有什么问题?模型字段应该表示选择值的类型;在您的案例中,您的选择是字符'F',M',U'
,因此您的模型应该具有性别=模型。CharField(max_length=1)
-这就是您要问的问题吗?嗯,我认为在这个场景中可能有比CharField更好的选择。(在DB查询方面更好。)字符字段有什么问题吗?那么实际上,我应该在models.py页面中放入SEX-touple并在那里导入“from django.forms import ModelForm”,以使表单也可以使用SEX选项并避免冗余吗?那么实际上,我是否应该在models.py页面中放置SEX-touple并在那里导入“from django.forms import ModelForm”,以使表单也可以使用SEX选项并避免冗余?您重复了两次。我在编辑建议中犯了一个错误:(难以置信。谢谢,我删除了重复的文本。自从python3.8以来,只在声明SEX\u选项
的内部声明变量可能更方便,比如SEX\u选项=((SEX\u-FEMALE:=“F”,“FEMALE”),…)
。你重复了两次女性。我在我的编辑建议中犯了一个错误:(难以置信。谢谢,我删除了重复的文本。自python3.8以来,在声明SEX\u选项的内部声明变量可能更方便,比如SEX\u选项=((SEX\u-female:=“F”,“female”),…)
。