如何验证Django是否存在ManyToMany关系?

时间:2016-04-08 08:49:15

标签: django django-models

class Interest(models.Model):
    name = models.CharField(max_length=255)

class Person(models.Model):
    name = models.CharField(max_length=255)
    interests = models.ManyToManyField(Interest, related_name='person_interests')

    def add_interest(self, interest_pk):
        interest = Interest.objects.get(pk=interest_pk)
        if not interests in self.interests:
            self.interests.add(interest)

上面的代码不起作用,但它表明了我想要做的事情。

简而言之,我想验证关系是否存在,如果不存在,则添加关系。使用django模型的有效方法是什么。

感谢。

3 个答案:

答案 0 :(得分:3)

如果您查看ManyRelatedManager的{​​{3}}功能,它已经在这里处理了您想要的内容:

vals = (self.through._default_manager.using(db)
        .values_list(target_field_name, flat=True)
        .filter(**{
            source_field_name: self.related_val[0],
            '%s__in' % target_field_name: new_ids,
        }))
new_ids = new_ids - set(vals)

它会删除直通表中已存在的所有ids。所以你真的不需要检查任何东西。您可以直接使用add功能:

def add_interest(self, interest_pk):
    self.interests.add(interest_pk)

当然,如果interest_pk尚不存在,它会抛出错误,因为这是add函数的基本要求。

答案 1 :(得分:2)

试试这个

def add_interest(self, interest_pk):
    interest = Interest.objects.get(pk=interest_pk)
    if interest not in self.interests.all():
        self.interests.add(interest)

答案 2 :(得分:1)

请检查这是否有帮助。

person = Person.objects.filter(name = 'something):
if person.count() > 0:
   interests = person[0].interests.all()
   if interests.count() > 0:
        ###DO something..

在这种情况下,

def add_interest(self, interest_pk):
    interests = self.interests.all()
    if interests.count():
           ### Add