Kus*_*rew 1 django many-to-many
django 中是否有任何方法可以通过查询集或 ids 列表过滤具有多对多关系的对象。在多对多中获取具有完全相同值的查询。模型
class Parent(models.Model):
name = models.CharField(max_length=1000)
children = models.ManyToManyField(Child, blank=True)
Run Code Online (Sandbox Code Playgroud)
意见
def filter_parents(request):
children = Child.objects.filter(id__in=[1,2,3])
parents = Parent.objects.filter(child=child)
return parents
Run Code Online (Sandbox Code Playgroud)
预期:我正在寻找在多对多领域拥有完全相同孩子的过滤父母
您可以在这种情况下使用链过滤。
from django.db.models import Count
children_id_list = [1, 2, 3]
parents = Parent.objects.annotate(count=Count('children')).filter(count=len(children_id_list))
for child_id in children_id_list:
parents = parents.filter(children__id=child_id)
Run Code Online (Sandbox Code Playgroud)
或者您可以使用 lambda 过滤:
c_id_list = [1, 2, 3]
parents = Parent.objects.annotate(count=Count('children')).filter(count=len(children_id_list))
parents = reduce(lambda p, id: parents.filter(child=id), c_id_list, parents)
Run Code Online (Sandbox Code Playgroud)
或者您可以使用Q()查询:
from django.db.models import Count, Q
children_id_list = [1, 2, 3]
parents = Parent.objects.annotate(count=Count('children')).filter(count=len(children_id_list))
query = Q()
for child_id in children_id_list:
query &= Q(children__id=child_id)
parents = parents.filter(query)
Run Code Online (Sandbox Code Playgroud)
因此,您将只获得在您的 id 列表中Parent包含所有这些对象的对象children。
| 归档时间: |
|
| 查看次数: |
2083 次 |
| 最近记录: |