我有3个与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上创建单个反向查询。我将把这个和q一起用来过滤多个选项。
例如:
有2个MainEvents,每个事件有2个或更多的事件,每个事件有2个或更多的子事件。我正在尝试创建单个查询,如下所示:
[MainEvent_1:[Event_1:[Subevent_1,Subevent_2,...],Event_2:[Subevent_5,...]], MainEvent_2:[Event_2:[Subevent_2,..]]]
目前,我正在创建保存所需输出的字典,但在这种情况下,我不能使用像&或|这样的Q关系。
最后,我在模板表中使用此数据来显示所有事件并对其进行过滤:
所需的表结构:
main event_1:
event_1:
subevent_1
subevent_2
event_2:
subev...
...........
main event_2:
event_2:
subev....
谢谢您抽时间见我。
发布于 2019-10-30 11:26:02
MainEvent.objects.filter(Q(event__subevent__done=True) | Q(event__subevent__done=False))
您可以使用类似下面的代码,然后使用.
inside循环访问子事件
for item in query:
for i in item.event_set.all():
for j in i.subevent_set.all():
print(i.name)
print(j.done)
发布于 2019-10-30 10:23:25
不能在一个查询中完成此操作,但可以使用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()
https://stackoverflow.com/questions/58621968
复制相似问题