Django charfield选项兼容性



我有一个有字段选择的模型。在保存的情况下,我要确保这个值在选项列表中

class Foo(models.Model):
GENDER_CHOICES = (
('M', 'Male'),('F', 'Female'),
)
gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

但是当我尝试保存选项外的值时,它会保存该值。

foo = Foo(gender = "A")                      
foo.save()

是的,我可以在像if value in genderlist:这样的代码中控制它,但在我的项目中,在每次使用选择保存时添加此控件需要花费如此多的时间。是否有机会在模型中控制它(重写保存方法或字段等的一些选项)?

是的,我可以在代码中控制它,就像性别列表中的值一样:但在我的项目中,将需要花费如此多的时间在每次使用选择保存中添加此控件。

这些选项确实是而不是在数据库级别强制执行的,并且Django的模型在保存数据之前出于性能原因不会验证数据。

如果你可以调用.full_clean()来验证模型对象,那么如果你调用foo.full_clean(),我们得到:

>>> foo.full_clean()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "djtest/env/lib/python3.8/site-packages/django/db/models/base.py", line 1238, in full_clean
raise ValidationError(errors)
django.core.exceptions.ValidationError: {'gender': ["Value 'A' is not a valid choice."]}

如果您使用ModelForm,如果值不是选项之一,它也会导致无效的形式。通常最好使用(Model)Form来检索数据,因为这样的表单可以返回所有错误并删除大量样板代码。

最新更新