2010-06-15 1 views
1

Хей, у меня есть модель, которая вмещает доскуПолучить QuerySets от Many2ManyField (включают в смежных областях)

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) 

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

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

Нить принадлежит к плате Windows, но это также относится к вычислительной плате через ассоциацию.

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

Я сделал это, но это очень грубо, я интересно, если есть более Джанго способ сделать это

Heres мой код этого на данный момент (работа)

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 

ответ

2

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

Вы можете использовать объекты Q. Если предположить, что ваша модель Совет имеет поле «имя», содержащее имя платы, я считаю, что следующее должно работать:

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

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

+0

Правильно, перечисление является нитью, оно переименовано. – dotty

+0

Что произойдет, если я не знаю имя платы, и я получаю плату с доской = Board.objects.get (pk = 4) – dotty

+0

board = Board.objects.get (pk = 3), затем threads = Threads. objects.filter (Q (board__parent_board = board)) работает! – dotty

Смежные вопросы