我正在创建一个Django应用程序,这个问题再次打击了我(我已经遇到过它,但我以一种我认为不正确的方式解决了它。)
所以我有这些模型:
ActionResult
任何人最多可以有3个身份(或没有)。这应该是一个只包含一些可能状态的字符串数组。例如快乐,幸运,坚强。
然而,在这里不可能选择CharField,因为一个人可能同时感到快乐和强壮。
我现在的方法是最好的吗?
答案 0 :(得分:3)
您需要在clean
方法中验证每个人的状态计数。
from django.db import models
from django.core.exceptions import ValidationError
class Status(models.Model):
name = models.CharField(max_length=30)
class Person(models.Model):
name = models.CharField(max_length=30)
status = models.ManyToManyField(Status)
def clean(self):
# check person status count
if self.status.all().count() > 3:
raise ValidationError("Person can not have more than 3 statuses")
<强>更新强>
由于它是ManyToMany
关系,因此在创建对象期间永远不会对此进行验证,除非您有单独的表单来为人员添加状态。
如果你有相同形式的人物创建的状态字段,那么这个检查必须在表格中。
class PersonForm(forms.ModelForm):
class Meta:
model = Person
def clean(self):
statuses = self.cleaned_data.get('status')
if status.count() > 3:
raise ValidationError("Person can not have more than 3 statuses")
为何选择此方法
这种模型设计将允许您有许多不同的查询方式。例如get people who are happy!
或count of people who are sad
,最后得到具有类似状态的人
答案 1 :(得分:0)
只是快速添加 - 如果您正在使用PostgreSQL(这可能是最好的决定),您还可以使用数组字段,您可以为其指定最大尺寸。
https://docs.djangoproject.com/en/1.8/ref/contrib/postgres/fields/
答案 2 :(得分:0)
另一种选择是使用像Django-taggit
这样的标记库