Как я могу выполнить запрос внешнего ключа - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь получить всю информацию о группе таблиц, чтобы избежать проблемы 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 

Я не знаю, как продолжить.Важно иметь доступ ко всем столбцам, а не к шаблонному запросу, потому что у меня много записей.

...