首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django ForeignKey反向查询

Django ForeignKey反向查询
EN

Stack Overflow用户
提问于 2019-10-30 17:15:20
回答 2查看 73关注 0票数 0

我有3个与FK相关的模型:

代码语言:javascript
运行
复制
class MainEvent(models.Model):
    name = models.CharField(max_length=512, blank=True)

class Event(models.Model):
    main_event = models.ForeignKey(MainEvent, blank=True, null=True, on_delete=models.CASCADE)
    name = models.CharField(max_length=512, blank=True)

class SubEvent(models.Model):
    event = models.ForeignKey(Event, blank=True, null=True, on_delete=models.CASCADE)
    done = models.BooleanField(default=False)

我需要的是在包含相关事件和子事件的模型MainEvent上创建单个反向查询。我将把这个和q一起用来过滤多个选项。

例如:

有2个MainEvents,每个事件有2个或更多的事件,每个事件有2个或更多的子事件。我正在尝试创建单个查询,如下所示:

代码语言:javascript
运行
复制
 [MainEvent_1:[Event_1:[Subevent_1,Subevent_2,...],Event_2:[Subevent_5,...]], MainEvent_2:[Event_2:[Subevent_2,..]]]

目前,我正在创建保存所需输出的字典,但在这种情况下,我不能使用像&或|这样的Q关系。

最后,我在模板表中使用此数据来显示所有事件并对其进行过滤:

所需的表结构:

代码语言:javascript
运行
复制
main event_1:
event_1:
subevent_1
subevent_2
event_2:
subev...
...........
main event_2:
event_2:
subev....

谢谢您抽时间见我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-30 19:26:02

代码语言:javascript
运行
复制
MainEvent.objects.filter(Q(event__subevent__done=True) | Q(event__subevent__done=False))

您可以使用类似下面的代码,然后使用. inside循环访问子事件

代码语言:javascript
运行
复制
for item in query:
    for i in item.event_set.all():
        for j in i.subevent_set.all():
            print(i.name)
            print(j.done)
票数 1
EN

Stack Overflow用户

发布于 2019-10-30 18:23:25

不能在一个查询中完成此操作,但可以使用prefetch_related()在三个查询中完成此操作

代码语言:javascript
运行
复制
MainEvent.objects.prefetch_related('event_set', 'event_set__subevent_set').all()

如果所有MainEvents都有Events,所有Events都有SubEvents,您可以通过从SubEvents开始并在代码中进行分组,在一个查询中完成:

代码语言:javascript
运行
复制
SubEvent.objects.select_related('event', 'event__main_event').all()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58621968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档