当前位置: 首页 > 面试题库 >

Django:对列表中的所有项目进行匹配的ManyToMany过滤器

凤高澹
2023-03-14
问题内容

我有这样的Book模型:

class Book(models.Model):
    authors = models.ManyToManyField(Author, ...)
    ...

简而言之:

我想检索作者严格等于给定作者集的书籍。我不确定是否有单个查询可以执行此操作,但是任何建议都会有所帮助。

总而言之:

这是我尝试过的((无法运行得到AttributeError)

# A sample set of authors
target_authors = set((author_1, author_2))

# To reduce the search space, 
# first retrieve those books with just 2 authors.
candidate_books = Book.objects.annotate(c=Count('authors')).filter(c=len(target_authors))

final_books = QuerySet()
for author in target_authors:
    temp_books = candidate_books.filter(authors__in=[author])
    final_books = final_books and temp_books

…这就是我得到的:

AttributeError: 'NoneType' object has no attribute '_meta'

总的来说,我应该如何像在我的案例中那样在其ManyToMany字段包含一组给定对象的约束下查询模型?

ps:我发现了一些相关的SO问题,但找不到清晰的答案。任何好的指针也将有所帮助。谢谢。


问题答案:

我找到了一个解决方案。但是,我认为效率可以提高。

# A sample set of authors
target_authors = set((author_1, author_2))

# To reduce the search space, first retrieve those books with just 2 authors.
candidate_books = Book.objects.annotate(c=Count('authors')).filter(c=len(target_authors))

# In each iteration, we filter out those books which don't contain one of the 
# required authors - the instance on the iteration.
for author in target_authors:
    candidate_books = candidate_books.filter(authors=author)

final_books = candidate_books


 类似资料:
  • 问题内容: 假设我有以下型号 在一个视图中,我有一个带有活动过滤器的列表,称为category。我想过滤所有具有类别标签的照片对象。 我试过了: 但这匹配类别中的任何项目,而不是所有项目。 因此,如果类别是[‘holiday’,’summer’],我希望Photo带有假日和夏季标签。 能做到吗? 问题答案: 正如jpic和sgallen在评论中所建议的那样,可以.filter()为每个类别添加一个

  • 问题内容: 我有一个与另一个对象具有多对多关系的对象。 在Django Admin中,这会在多重选择框中产生很长的列表。 我想过滤掉ManyToMany关系,所以我只获取客户选择的城市中可用的类别。 这可能吗?我需要为其创建一个小部件吗?如果是这样,我该如何将行为从标准ManyToMany字段复制到该字段,因为我也希望filter_horizo​​ntal函数。 这些是我的简化模型: 问题答案:

  • 问题内容: 如何获得AngularJS中过滤器预测返回的项目的长度/数量? 问题答案: 感谢Pawel Kozlowski,我设法在AngularJS Google网上找到了一个不错的答案。 可以动态创建列表,您可以使用当前范围中的其他任何位置来显示计数。

  • 问题内容: 我开始使用django-tables2(从第一印象中就可以强烈推荐),我问自己如何实现列过滤。我找不到合适的文档,但是我确定它在那里。 问题答案: 答案有点晚了,但是无论如何…我也找不到任何合适的文档来进行列过滤。有很多方法可以做到这一点: 答:手动:我添加了一个包含要过滤的字段的表单,然后在我的视图中执行以下操作: 这很好用,但是不是那么干,因为它在视图中是硬编码的。 B.使用Sin

  • 在这种情况下,我需要根据项的某些属性(即条件是内部的而不是外部的)筛选。我发现javafx有,所以我尝试了一下。我可以设置谓词和筛选工作,直到确定筛选的属性值发生变化。现在可以像下面这样设置谓词: 由于谓词返回boolean而不是BooleanProperty,因此对该属性的更改不会反映在列表中。 对此有什么简单的解决办法吗?我可以尝试做一些变通方法,例如创建一个单独的列表并同步它,或者每次属性在

  • 问题内容: 我有一个带有自引用外键关系的模型: 现在,我想为一个人获得所有多层次的孩子。如何为它编写Django查询?它需要表现得像递归函数。 问题答案: 你可以随时向模型添加递归函数: 编辑:根据韩善基更正 (如果你有大量的递归或数据,请不要使用它。) 仍然建议errx建议的mptt。