Получить QuerySets от Many2ManyField (включая связанные поля) - PullRequest
1 голос
/ 15 июня 2010

Hay, у меня есть модель, в которой находится доска

class Board(models.Model):
    parent_board = models.ForeignKey('self', blank=True, null=True)

Каждая доска может принадлежать другой доске

Так сказать

Linux
Windows
OS X

может принадлежать доске под названием

Computing

На этих досках находится объект Thread

class Thread(models.Model):
    board = models.ForeignKey(Board)

Теперь, скажем, я назначил Thread на доску Windows, я могу легко получить этот объект.

Но я хочу перечислить все темы, связанные с вычислениями

Поток принадлежит плате Windows, но он также будет принадлежать Вычислительной плате через ассоциацию.

Как я могу запустить Запрос на вычислительной плате и извлечь все потоки из ее подсистем (а также все принадлежащие только вычислительному потоку)?

Я сделал это, но это очень грубо, мне интересно, есть ли более Django способ сделать это

Вот мой код на данный момент (работает)

listings = [] # blank list to hold clean values
for board in board.board_set.all(): # for each board 
    for listing in board.listing_set.all(): # get the listing from each board
        listings.append( listing ) # append to the listings list

1 Ответ

2 голосов
/ 15 июня 2010

[Ваш qn показывает модель 'Thread', но затем продолжает ссылаться на 'list_set' в вашем коде работы - я предполагаю, что это опечатка?]

Вы можете использовать объекты Q.Предполагая, что в вашей модели Board есть поле 'name', содержащее имя платы, я считаю, что должно работать следующее:

from django.db.models import Q
Thread.objects.filter(Q(board__parent_board__name='Computing') | Q(name='Computing'))

Первый объект Q выбирает потоки, являющиеся частью доски, для которой установлен 'parent_board'на доску с именем 'Computing'.Второй объект Q выбирает потоки, которые являются непосредственно частью платы с именем «Computing».

...