2010-06-15 10 views
1

Hay, j'ai un modèle qui abrite un conseilObtenir QuerySets de Many2ManyField (inclure des champs liés)

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

Chaque conseil peut appartenir à un autre conseil

donc dire

Linux 
Windows 
OS X 

peut appartenir à une carte appelée

Computing 

Ces panneaux abritent un objet Thread

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

Maintenant, disent-je attribuer un fil à la carte Windows, je peux facilement obtenir cet objet.

Mais je veux la liste de tous les threads associés à l'informatique

Le fil appartient au conseil d'administration de Windows, mais il appartiendra aussi au conseil d'administration de l'informatique par l'association.

Comment puis-je exécuter une requête sur la carte de calcul et récupérer tous les threads de ses sous-cartes (ainsi que ceux appartenant au seul thread de calcul)?

Je l'ai fait, mais il est très rudimentaire, je me demande s'il y a une façon plus Django de le faire

Heres mon code de celui-ci au moment (travail)

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 

Répondre

2

[Votre qn montre un modèle 'Thread' mais continue en se référant à 'listing_set' dans votre code wokring - je suppose qu'il s'agit d'une faute de frappe?]

Vous pouvez utiliser des objets Q. En supposant que votre modèle de conseil a un champ « nom » contenant le nom du conseil, je crois que ce qui suit devrait fonctionner:

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

Le premier objet Q sélectionne les sujets qui font partie d'un conseil d'administration qui a « parent_board » set à un conseil d'administration avec le nom «Informatique». Le second objet Q sélectionne les threads qui font directement partie d'une carte portant le nom 'Computing'.

+0

correct, la liste est un fil, il a été renommé. – dotty

+0

Que se passe-t-il si je ne connais pas le nom du forum et que j'obtiens le tableau avec board = board.objects.get (pk = 4) – dotty

+0

board = Board.objects.get (pk = 3) puis threads = Threads. objects.filter (Q (board_parent_board = board)) fonctionne un régal! – dotty