需要有关Django Modeling的帮助

时间:2015-07-23 03:21:24

标签: python django models modeling

我正在创建一个Django应用程序,这个问题再次打击了我(我已经遇到过它,但我以一种我认为不正确的方式解决了它。)

所以我有这些模型:

ActionResult

任何人最多可以有3个身份(或没有)。这应该是一个只包含一些可能状态的字符串数组。例如快乐,幸运,坚强。

然而,在这里不可能选择CharField,因为一个人可能同时感到快乐和强壮。

我现在的方法是最好的吗?

3 个答案:

答案 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

这样的标记库