2015-07-23 2 views
0

Я создаю приложение Django, и эти вопросы снова поражают меня (я уже сталкивался с этим, но я решил это так, как я не думаю, что это правильно).Нужна помощь по Django Modeling

Так у меня есть эти модели:

def Person(models.Model): 
    name = models.CharField(max_length=30) 
    status = models.ManyToManyField(Status) 

def Status(models.Model): 
    name = models.CharField(max_length=30) 

Любое лицо может иметь до 3 статусов (или без него). И это должно было быть строковым массивом, содержащим только несколько возможных состояний. например счастливый, удачливый, сильный.

Однако CharField с выбором здесь невозможен, поскольку один человек может чувствовать себя счастливым и сильным одновременно.

Является ли мой нынешний подход лучшим возможным?

+0

Вы могли бы иметь несколько логических атрибутов под статусом (один для каждого настроения)? – user3636636

+0

Если вы хотите иметь только несколько возможных статусов, рассмотрите [fixture] (https://docs.djangoproject.com/en/1.8/howto/initial-data/)? – NightShadeQueen

+0

Да, у меня будет светильник для статуса. – agnans

ответ

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") 

Update

Поскольку это 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, и, наконец, получить людей с похожими статусами

+0

Ударьте мне это;) –

+0

Хорошо, но как вы думаете, это лучший метод? Создание модели для статуса странно для меня, потому что у нее есть только одно поле. Но я думаю, что это единственный способ, верно? – agnans

+0

@agnans Каковы ваши требования? Если вы хотите, чтобы у человека было много статусов и статус, у вас может быть много людей, тогда вы на правильном пути. – Othman

0

Просто быстрое дополнение - если вы используете PostgreSQL (и это, вероятно, лучшее решение), вы также можете использовать поле Array Field, для которого вы можете указать max размер.

https://docs.djangoproject.com/en/1.8/ref/contrib/postgres/fields/