2012-01-12 4 views
0

Мне нужна модель, которая будет связана с максимум тремя данными (одного типа).Django - Какая модель для ограниченных связанных данных

Вот пример:
У меня есть кандидаты, которые должны пройти 3 шага, которые будут набраны

class Candidate(models.Model): 
    user = models.ForeignKey(User) 
    step1 = models.TextField(blank=True, null=True,) 
    step2 = models.TextField(blank=True, null=True,) 
    step3 = models.TextField(blank=True, null=True,) 

Для каждого шага есть обзор несколько лиц

class Review(models.Model): 
    candidate = models.ForeignKey(Candidate) 
    reviewer = models.ForeignKey(User) 
    step1 = models.TextField(blank=True, null=True,) 
    step2 = models.TextField(blank=True, null=True,) 
    step3 = models.TextField(blank=True, null=True,) 
  • Должен Я факторизую эти объекты, которые дадут мне 4 объекта вместо 2
    таких как Candidate, Review, CandidateStep и ReviewStep?
    • Если да, то как я могу ограничить до 3 шагов?
    • Если нет, то как можно легко пройти через этапы?

Пример данных:

obj, created = Candidate.objects.get_or_create(
    user = SelectedCandidate 
, defaults = {'step1': '', 'step2': '', 'step3': ''} 
) 
obj.step1 = 'I\'m really motivated' 
obj.step2 = 'I\'m able to do this job' 
obj.save() 

obj, created = Review.objects.get_or_create(
    user = request.user 
, defaults = {'step1': '', 'step2': '', 'step3': ''} 
) 
obj.step1 = 'He seems over motivated' 
obj.save() 
+0

Это зависит от того, что вы на самом деле собираетесь * положить * в эти поля. Можете ли вы привести некоторые данные примера? – Nate

ответ

1

Что около трех объектов:

class Candidate(models.Model): 
    name = models.CharField(max_length=50) 

class Step(model.Model): 
    candidate = models.ForeignKey(Candidate) 
    text = models.TextField(blank=True) 

class Review(models.Model): 
    reviewer = models.ForeignKey(User) 
    step = models.OneToOneField(Step) 
    text = models.TextField(blank=True) 

как я могу ограничить до 3 шагов?

На уровне обзора. Если вы собираетесь использовать ModelFromset, воспользуйтесь опцией max_num.

+0

Это намного лучше. Однако я не буду использовать 'ModelFormset' всюду. Знаете ли вы, как я могу ограничить это в объекте? Может быть, с менеджером или чем-то. –

+1

@Glide. Вы можете проверить количество шагов в методе 'save', это просто, но делает один дополнительный БД. Или вы можете добавить поле «steps_num» в «Candidate» и обновить его с помощью сигналов. Он будет эффективным, но немного денормализованным. :-) Я бы предпочел последний. – DrTyrsa

Смежные вопросы