Запрос через несколько моделей - PullRequest
0 голосов
/ 28 ноября 2011

У меня есть проект django с 5 разными моделями. Все они имеют поле даты. Допустим, я хочу получить все записи от всех моделей с сегодняшней датой. Конечно, я мог бы просто отфильтровать каждую модель и поместить результаты в один большой список, но я считаю, что это плохо. Какой эффективный способ сделать это?

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

Я не думаю, что это плохая идея запрашивать каждую модель отдельно - на самом деле, с точки зрения базы данных, я не понимаю, как вы могли бы поступить иначе, так как каждая модель будет нуждаться в отдельном запросе SQL , Даже если, как предлагает @Nagaraj, вы устанавливаете общую модель Date для всех других ссылок на модели, вам все равно придется запрашивать каждую модель отдельно. Вы, вероятно, правы, однако, что помещать результаты в список - это плохая практика, если только вам не нужно загружать каждый объект в память, как объяснено здесь :

Имейте в виду, однако, что [оценка QuerySet как списка] может иметь большие накладные расходы памяти, потому что Django загрузит каждый элемент списка в память. Напротив, итерация по QuerySet будет использовать вашу базу данных для загрузки данных и создания экземпляров объектов только тогда, когда они вам нужны.

Трудно предложить другие варианты, не зная больше о вашем сценарии использования. Тем не менее, я думаю, что я, вероятно, подхожу к этому, создав список или словарь QuerySets, которые я мог бы затем использовать в своем представлении, например ::10000*.

querysets = [cls.objects.filter(date=now) for cls in [Model1, Model2, Model3]]
2 голосов
/ 28 ноября 2011

Посмотрите, как использовать Множественное наследование (документы здесь ), чтобы определить те поля даты в классе, которые вы можете подклассить в классах, которые вы хотите вернуть в запросе.

Например:

class DateStuff(db.Model):
  date = db.DateProperty()

class MyClass1(DateStuff):
  ...

class MyClass2(DateStuff):
  ...

Я полагаю, что Django позволит вам выполнять запросы к классу DateStuff и будет возвращать объекты из MyClass1 и MyClass2.

Спасибо @nrabinowitz зауказывая на мою предыдущую ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...