【问题标题】:How to make filter queryset for a model having a many to many attribute for multiple values in Django [duplicate]如何为在Django中具有多个值的多对多属性的模型制作过滤器查询集[重复]
【发布时间】:2016-12-20 19:13:23
【问题描述】:

描述:- 我想过滤所有作者为 john & paul 的条目。以下是我正在使用的模型。谁能解决这个问题:

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

【问题讨论】:

  • Entry.objects.filter(authors__in=[Author.objects.get(name='John'),Author.objects.get(name='Paul')]).distinct()
  • 这是不可能的。我们希望所有这样的条目都存在两位作者。
  • @BurhanKhalid 为什么将问题标记为已存在。如果已存在,您可以在此处给出正确答案。

标签: python django django-queryset


【解决方案1】:

只需过滤两次(如@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)

【讨论】:

  • 我已经尝试过这种方法,但我们仍然无法获得两位作者都在那里的所有此类条目。
【解决方案2】:

只需使用两次过滤器

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

【讨论】:

  • 我不喜欢这种方式,因为如果有更多的作者那么我们的查询会很长。所以我们需要一些其他具体的方法来解决这些查询。但仍然感谢您的回答。跨度>
  • 另一种方法是使用 Q 对象,我怀疑它是否适用于这种情况
  • Q 对象在这里不起作用,因为它主要用于使用带有 OR 操作的复杂查询。
猜你喜欢
  • 1970-01-01
  • 2020-04-30
  • 2021-05-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
  • 2022-01-12
  • 2020-06-16
  • 2021-06-07
相关资源
最近更新 更多