2014-10-04 5 views
0

Скажем, у меня есть 3 модели в Django: Person, Workfield и SubWorkfield.Отношения с парами взаимосвязанных моделей

person может иметь много workfield -s и многие subWorkfield -s, а также, но subWorkfield -s должны быть связаны с их родителем workfield -s (которую person должны быть связаны).

Так как же я в жизнь, что всякий раз, когда person связан с subWorkfield то он должен также быть связан с родителем, который subWorkfield «s workfield?

Вот что я до сих пор, но я не думаю, что он навязывает отношения:

class Person(models.Model): 
    name = models.CharField(max_length=200) 
    workfield = models.ManyToManyField(Workfield) 
    subworkfield = models.ManyToManyField(SubWorkfield) 


class Workfield(models.Model): 
    name = models.CharField(max_length=200) 


class SubWorkfield(models.Model): 
    name = models.CharField(max_length=200) 
    workfield = models.ForeignKey(Workfield) 

Мне нужно иметь workfield с и subWorkfield -s развязкой, так как person может принадлежать workfield без любой subWorkfield -s.

ответ

0

На самом деле нет хорошего способа сделать то, что вы хотите, только со структурой таблицы. Тем не менее, если вы сделаете следующее:

class Person(models.Model): 
    name = models.CharField(max_length=200) 
    workfields = models.ManyToManyField(Workfield) 
    subworkfields = models.ManyToManyField(SubWorkfield) 

    def add_subworkfield(self, subworkfield): 
     if subworkfield.workfield not in self.workfields: 
      return False 
     else: 
      self.subworkfields.append(subworkfield)  


class Workfield(models.Model): 
    name = models.CharField(max_length=200) 


class SubWorkfield(models.Model): 
    name = models.CharField(max_length=200) 
    workfield = models.ForeignKey(Workfield) 

И тогда вы будете просто использовать метод add_subworkfield при добавлении subworkfields к Person с.

В качестве альтернативы, внутри Person модели можно переопределить save метод:

class Person(models.Model): 
    ... 
    def save(self, *args, **kwargs): 
     for subworkfield in self.subworkfields: 
      if subworkfield.workfield not in self.workfields: 
       return 
     super(Person, self).save(*args, **kwargs) 

Если это небольшое приложение, и это только вы, то первый способ должен быть достаточно. Однако, если вы работаете над чем-то большим с несколькими людьми, переопределение save было бы безопасным, если кто-то не использует метод add_subworkfield.

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