如何做多对多的Django查询找到2位给定作者的书?

Mic*_*ong 16 python django many-to-many django-queryset

我有一个查询,需要使用ID过滤2个作者

从理论上讲,

Book.objects.filter(author__id=1, author__id=2). 
Run Code Online (Sandbox Code Playgroud)

这是不可能的.

我怎么解决这个问题?

干杯,米奇

Yuj*_*ita 39

起初并不直观,但答案就在我们面前.

Book.objects.filter(author__id=1).filter(author__id=2)
Run Code Online (Sandbox Code Playgroud)

如果您想要完全匹配,则可能会通过仅包含2个作者的项目进一步过滤此结果.

Book.objects.annotate(count=Count('author')).filter(author__id=1)\
                .filter(author__id=13).filter(count=2)
Run Code Online (Sandbox Code Playgroud)

如果你想动态完全匹配,那么这样的事情怎么样?:

def get_exact_match(model_class, m2m_field, ids):
    query = model_class.objects.annotate(count=Count(m2m_field))\
                .filter(count=len(ids))
    for _id in ids:
        query = query.filter(**{m2m_field: _id})
    return query

matches = get_exact_match(MyModel, 'my_m2m_field', [1, 2, 3, 4])

# matches is still an unevaluated queryset, so you could run more filters
# without hitting the database.
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有注释,则匹配不是独占的.与作者[1,2,3]的书籍将与作者[1,2]的书籍搜索相匹配.如果您愿意,可以删除注释和第一个过滤器. (3认同)
  • 代码中存在错误 - 查询应如下所示:`query = query.filter(**{m2m_field:_id})` (2认同)