2013-08-02 18 views
2

可以說我有以下車型的Django模型:如何阻止與本身在M2M

class Person(models.Model): 
    related_people = models.ManyToManyField('Person', 
              blank=True, 
              related_name='ret_related_people', 
              through='RelationshipType') 

class RelationshipType(models.Model): 
    person1 = models.ForeignKey('Person', related_name='rel_back_1') 
    person2 = models.ForeignKey('Person', related_name='rel_back_2') 

    type = models.CharField(max_length=16) 

有什麼辦法來防止有關本身Person

回答

0

未經測試:

class Person(models.Model): 
    related_people = models.ManyToManyField('self', 
             blank=True, 
             related_name='ret_related_people', 
             through='RelationshipType', 
             symmetrical=False) 

class RelationshipType(models.Model): 
    from_person = models.ForeignKey('Person', related_name='from_people') 
    to_person = models.ForeignKey('Person', related_name='to_people') 
    type = models.CharField(max_length=16) 

    def clean(self): 
     if self.from_person == self.to_person: 
      from django.core.exceptions import ValidationError 
      raise ValidationError("People can't have a relationship to self") 
+0

它工作在管理,但我需要手動清潔第方法調用上的代碼。 –

+0

有趣的是,當你調用相關字段的'add'方法時,它不會調用'clean()'?也許值得在RelatedManager上覆蓋這個方法... –