2014-10-04 74 views
0

比方说,我有3个车型在Django:WorkfieldSubWorkfield与对相关车型的关系

一个person可以有很多workfield -s和许多subWorkfield -s为好,但subWorkfield -s必须与他们的父母workfield -S(其中person必须涉及到)。

那么,如何执行,每当person关系到一个subWorkfield那么他也必须与该subWorkfield的父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 S和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) 

,然后加subworkfields到Person那时你只会使用add_subworkfield方法。如果它是一个小的应用程序,它只是你,第一种方法就足够了

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) 

另外,该Person模型里面,你可以重写save方法。但是,如果您正在处理与多个人相关的更大事务,那么覆盖save将是一个安全事件,因为有人不使用add_subworkfield方法。