Django 多对一关系过滤器集

kev*_*son 3 python django django-orm

我有几个模型设置,如下所示:

Group(models.Model):
    name = models.TextField(max_length=255)

Thing(models.Model):
    location = models.TextField(max_length=255)
    group = models.ForeignKey(Group)
Run Code Online (Sandbox Code Playgroud)

这只是说明关系的一个例子,所以请原谅任何语法错误。

我的问题是,如何找到具有一组特定位置的组?我应该能够使用以下方法访问与组关联的事物:

Group.thing_set
Run Code Online (Sandbox Code Playgroud)

对?那么有什么方法可以根据thing_set中的项目进行过滤吗?我在想一些类似的事情。

Group.objects.filter(thing_set.location in ["Location A", "Location B"]).all()
Run Code Online (Sandbox Code Playgroud)

希望这能将包含来自位置 A 和位置 B 的内容的每个组都返回给我。任何建议或朝正确方向的推动都会非常有帮助!

谢谢。

Seb*_*zny 5

根据文档,您必须使用模型名称作为查询运算符:

要引用“反向”关系,只需使用模型的小写名称。

模型.py:

from django.db import models


class Group(models.Model):
   name = models.TextField(max_length=255)


class Thing(models.Model):
    location = models.TextField(max_length=255)
    group = models.ForeignKey(Group)
Run Code Online (Sandbox Code Playgroud)

视图.py:

from django.views.generic import ListView


class ReverseFK(ListView):
    model = Group

    def get_queryset(self):
        g = Group.objects.create(name="example")
        g.save()
        Thing.objects.create(location="here", group=g)
        return Group.objects.filter(thing__location__in=["here","there"])
Run Code Online (Sandbox Code Playgroud)

github 上的工作代码示例

  • 你让我在正确的方向上找到了足够的答案。这是我找到问题的最终解决方案的地方:http://stackoverflow.com/questions/8618068/django-filter-queryset-in-for-every-item-in-list (2认同)