Django ForeignKey反向查询



我有三个型号与FK:相互关联

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上创建一个反向查询,该查询包含相关的Events和Subevents。我将把这个和Q一起用于过滤多个选项。

例如:

有2个主事件,每个主事件有2个或多个事件,每个事件有2个子事件。我正试图创建一个类似这样的单一查询:

[MainEvent_1:[Event_1:[Subevent_1,Subevent_2,...],Event_2:[Subevent_5,...]], MainEvent_2:[Event_2:[Subevent_2,..]]]

目前,我正在创建一个包含所需输出的字典,但这样我就不会使用像&或|。

最后,我在模板表中使用这些数据来显示所有事件并过滤它们:

所需的表格结构:

main event_1:
event_1:
subevent_1
subevent_2
event_2:
subev...
...........
main event_2:
event_2:
subev....

谢谢你抽出时间。

MainEvent.objects.filter(Q(event__subevent__done=True) | Q(event__subevent__done=False))

您可以使用类似的东西,然后使用.内部循环访问子事件

for item in query:
for i in item.event_set.all():
for j in i.subevent_set.all():
print(i.name)
print(j.done)

不能在一个查询中完成,但可以使用prefetch_related():在三个查询中进行

MainEvent.objects.prefetch_related('event_set', 'event_set__subevent_set').all()

如果您的所有MainEvents都有Events,所有Events都有SubEvents,那么您可以从SubEvents开始在一个查询中进行分组:

SubEvent.objects.select_related('event', 'event__main_event').all()

最新更新