Я пытаюсь получить всю информацию о группе таблиц, чтобы избежать проблемы N + 1.
У меня есть модель Peewee под названием Zone
.Также у меня есть еще один объект под названием MyObject
.MyObject
s относятся к Zone
, поэтому в моей модели я объявил MyObject.zone
как ForeignField с MyObject
s как связанный параметр (как к нему можно получить доступ из зоны).
Теперь,Я хочу получить все объекты внутри (со всеми столбцами) zone
, чтобы отправить его по JSON.Наивным подходом будет цикл for
внутри Zone.select()
, а затем внутри цикла будет получена информация о каждом Object
.Проблема с этим подходом состоит в том, что у меня много записей, и это вызовет проблему N + 1.
Способ, рекомендованный документацией Peewee, - это сделать Join
, а затем получить всеинформация только в одном запросе, что-то вроде этого:
Zone.select(Zone, MyObject).join(MyObject)
Проблема здесь в том, что возвращаемый запрос имеет N записей (где N - количество объектов), и каждая запись - это Zone
только содин объект, это неправильно.Он должен возвращать M записей, где M - это число Zone
с и внутри Zone.myobjects
для каждого Zone
, иметь список с количеством объектов, принадлежащих этому zone
.
query = Zone.select(Zone,MyObject).join(Zone)
zones = list(query) # N zones, not M
zone[0].myobjects # It cointains a query template
Я пытался сделать group by
, но у меня тоже проблемы.
query = Zone.select(Zone,MyObject).join(Zone).group_by(MyObject.zone)
zones = list(query) # M zones, that is good but inside each zone, zone.lights has nothing and zone.myobjects is only one object no a list
zone[0].myobjects # It cointains a query template
Я не знаю, как продолжить.Важно иметь доступ ко всем столбцам, а не к шаблонному запросу, потому что у меня много записей.