Нужна помощь с дизайном модели Django, ManyToManyField «через» промежуточную модель и ее последствия для уникальности - PullRequest
0 голосов
/ 19 ноября 2009

У меня есть следующие модели Django: -

class Company(models.Model):
    name = models.CharField(max_length=50)
    is_active = models.BooleanField(db_index=True)

class Phase(models.Model):
    company = models.ForeignKey(Company)
    name = models.CharField(max_length=50)
    is_active = models.BooleanField(db_index=True)

class Process(models.Model):
    company = models.ForeignKey(Company)
    name = models.CharField(max_length=50)    
    phases = models.ManyToManyField(Phase, through='ProcessPhase')
    is_active = models.BooleanField(db_index=True)

class ProcessPhase(models.Model):
    process = models.ForeignKey(Process)
    phase = models.ForeignKey(Phase)
    order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?", unique=True)

«Компания» имеет свои «процессы» и «фазы». Процесс (компании) состоит из одного или нескольких этапов (компании). Каждая фаза, связанная с процессом, имеет «порядок». Требование следующее: -

  1. в конкретном процессе компании фаза может появиться только один раз;
  2. также «фаза A» и «фаза B» в процессе не могут иметь одинаковый порядок.

Так что мне нужно знать: -

а) как указать некоторые «уникальные» в определении модели для выполнения вышеуказанных требований;

b) какая уникальность, если таковая имеется, автоматически подразумевается в ManyToManyField?

Ответы [ 2 ]

3 голосов
/ 19 ноября 2009

В вашем случае, поскольку вы говорите: «Процесс (компании) состоит из одного или нескольких этапов (компании)», похоже, у вас должна быть такая структура:

Company <----* Process <----* Phase

Компания имеет свои процессы, процесс имеет свои фазы. На самом деле это не ManyToMany отношение, это OneToMany (процесс имеет много фаз, но каждая фаза связана с одним процессом).

Если это так, вы должны иметь

class Phase(models.Model):
    process = models.ForeignKey(Process, null=True) # based on your comment, if a Phase does not belong to a Process, leave it null.
    phase = models.ForeignKey(Phase)
    order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?")


    class Meta:
        unique_togather = ("process", "order")

Я думаю, что unique_together в классе Meta - это то, что вы хотите. Он обеспечивает как на уровне администратора, так и на уровне базы данных уникальность этих двух полей вместе.


редактирование:
(ForeignKey поле может быть пустым - см. this )


на основании вашего комментария:

Не используйте ManyToMany, так как он автоматически генерирует «таблицу посередине», в то время как она вам нужна для ваших нужд. Вместо этого попробуйте определить другую модель (вместе с вашими Company, Phase и Process):

class PhaseOrder(models.Model):
  process = models.ForeignKey(Process)
  phase = models.ForeignKey(Phase)
  order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?")
  class Meta:
    unique_together = (("process", "order"), ("process", "phase"))
1 голос
/ 19 ноября 2009

Не должна ли фаза всегда принадлежать процессу? Если это так, вы можете сказать, что комбинация «Процесс» и «Заказ» фазы должна быть уникальной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...