【发布时间】:2015-01-28 23:28:37
【问题描述】:
假设我有以下 3 个模型,其中 2 个模型与第 3 个模型具有 M2M 关系。
class FirstModel(models.Model):
third_model = models.ManyToMany('ThirdModel')
class SecondModel(models.Model):
third_model = models.ManyToMany('ThirdModel')
class ThirdModel(models.Model):
pass
现在,进一步假设我有一个特定的SecondModel 对象和一个FirstModel QuerySet。我需要过滤QuerySet,以便生成的QuerySet 只包含与ThirdModel 设置的M2M 关系与SecondModel 对象的M2M 关系设置与@987654332 完全相同的FirstModel 对象@。
def some_filtering_method(first_model_qs, second_model):
third_models_set = second_model.third_model_set.all()
first_model_ids = list()
for third_model in third_models_set:
first_model_ids.append(
[first_model.pk
for first_model in third_model.first_model_set.all()])
intersection_of_first_model_ids = get_intersection(first_model_ids)
return first_model_qs.filter(pk__in=intersection_of_first_model_ids)
在 Django 中是否有更 Pythonic 的方式来执行此操作?我尝试了以下操作但没有成功(在查看原始查询后,很明显为什么它不起作用)。
import operator
from django.db.models import Q
def some_filtering_method(first_model_qs, second_model):
return first_model_qs.filter(
reduce(
operator.and_,
(Q(third_model_set__contains=x)
for x in second_model.third_model_set.all())
)
)
【问题讨论】:
标签: django many-to-many