如何为在Django中具有多个值的多对多属性的模型创建过滤器查询集

问题描述:

描述: - 我想过滤所有作者为john & paul的条目。以下是我正在使用的模型。任何人都可以解决这个问题:如何为在Django中具有多个值的多对多属性的模型创建过滤器查询集

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

    def str__(self):    # unicode__ on Python 2 
    return self.name 

class Author(models.Model): 
    name = models.CharField(max_length=200) 
    email = models.EmailField() 

    def str__(self):    # unicode__ on Python 2 
     return self.name 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 
    body_text = models.TextField() 
    pub_date = models.DateField() 
    mod_date = models.DateField() 
    authors = models.ManyToManyField(Author) 
    n_comments = models.IntegerField() 
    n_pingbacks = models.IntegerField() 
    rating = models.IntegerField() 

    def str__(self):    # unicode__ on Python 2 
     return self.headline 
+0

'Entry.objects.filter(authors__in = [Author.objects.get( name ='John'),Author.objects.get(name ='Paul')])。distinct()' –

+0

这是不可能的。我们希望所有这些作者都在那里。 –

+0

@BurhanKhalid你为什么把问题标记为已经存在。如果它已经存在,你可以在这里给出正确的答案。 –

只是过滤两次(如@ dnit13说)。它的唯一途径

Entry.objects.all().filter(authors__name='john').filter(authors__name='paul') 

如果作者的名单是动态的:

authors = ['john', 'paul'] 
entries = Entry.objects.all() 
for author in authors: 
    entries = entries.filter(authors__name=author) 
+0

我已经尝试过这种方法,但是我们仍然不会得到所有这些作者都在那里的条目。 –

只需使用过滤器两次

Entry.objects.filter(authors__name='john').filter(authors__name='paul') 
+0

我不喜欢这种方式,好像会有更多的作者,那么我们的查询会很长。所以我们需要一些其他具体的方法来解决这样的查询。但仍然谢谢你的答案。 –

+0

另一种方式是使用Q对象,我怀疑它会适用于这种情况 – dnit13

+0

由于Q对象主要用于使用OR操作的复杂查询,因此无法在此处工作。 –