Пользовательский SQL Django для возврата QuerySet, где каждый объект имеет дополнительные свойства - PullRequest
1 голос
/ 14 января 2009

Допустим, у меня есть следующие объекты:

squirrel_table 
  - name
  - country_of_origin
  - id

nut_table
  - id
  - squirrel_who_owns_me[fk to squirrel]

Я хочу получить список всех белок в конкретной стране. Возвращенные белковые объекты могут быть в QuerySet, но не обязательно. Список будет достаточно. У каждой белки будет дополнительное свойство, называемое nut_count. SQL для этого будет выглядеть примерно так (обратите внимание, я использую подзапрос, чтобы не перечислять все столбцы белка, поскольку в действительности их будет много) (я использую PostgreSQL):

select sq.*,
       nut_counts.nut_count
  from squirrel_table sq,
      (select sq2.id as squirrel_id,
              count(nuts) as nut_count
         from squirrel_table sq2,
              nut_table nuts
        where nuts.squirrel_who_owns_me = sq2.id
          and sq.country_of_origin = 'USA'
        group by sq2.id) as nut_counts
 where sq.id = nut_counts.squirrel_id

Есть ли способ выполнить SQL, взять созданный им курсор, превратить его в список объектов белка и добавить число_ орехов к каждой белке?

Ответы [ 2 ]

3 голосов
/ 14 января 2009

Вы, вероятно, хотите прочитать документацию для метода "extra ()" , которая включает пример аналогичной ситуации "выберите что-то другое и добавьте ее к каждому объекту".

0 голосов
/ 06 октября 2010

Если вам нужно выполнить SQL, используйте raw (). если вы добавите в pk «выберите table.id как pk, table. * ...», то он будет действовать как QuerySet, к которому вы можете привыкнуть.

sql = 'select sq.id as pk, sq.* ... %s'
squirreled = squirrel_table.objects.raw(sql, ["arg1"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...