2011-04-07 3 views
0

Je ferai de mon mieux pour décrire ce que j'essaie de faire ici. J'ai 3 classes:Utilisation du filtre dans une requête avec 2 champs ManyToMany dans Django

  • Question
  • questiontype
  • QuestionTemplate

Et les relations sont:

  • Question < -ManyToMany-> questiontype
  • QuestionTemplate < -ManyToMany-> questiontype

Ainsi, la requête est une méthode à l'intérieur QuestionTemplate qui me fait une liste de questions possibles qui ont le même questiontype qui sont liés à la QuestionTemplate. J'ai essayé: questions = Question.objects.filter(type__in = template.type.all()) Où "template" est un objet QuestionTemplate. Mais cette requête me renvoie les questions qui ont au moins un QuestionType dans la liste QuestionType du modèle. Ce que je veux faire, c'est avoir exactement les mêmes QuestionTypes dans la question et le modèle.

J'ai essayé beaucoup de choses, mais je n'arrive pas à faire fonctionner ça, s'il vous plaît, quelqu'un me sauve!

+0

veuillez clarifier ce que vous essayez d'obtenir. Vous essayez d'obtenir les questions qui sont exactement les mêmes dans le ...? Je pense que vous avez laissé quelques mots sur votre message initial. – DTing

+0

Je veux obtenir les questions qui ont les mêmes (exactement) connexions à QuestionType sur un QuestionTemplate donné. Donc, si je reçois un modèle qui a le QuestionType = (Type1, Type2 et Type3) La requête retournera toutes les questions qui ont les connexions à QuestionType = (Type1, Type2, Type3). Donc toute autre question qui a une connexion différente à QuestionType, comme (Type1, Type2 et Type5) ne serait pas entrer dans la liste .. Il en va de même pour une question qui a le QuestionTypes = (Type1 et Type2), car il n'a pas le type3 comme le modèle, il serait également rejeté. – Arruda

Répondre

0
types = template.type.all() 
query = Question.objects 
for t in types: 
    query = query.filter(type = t) 
questions = [] 
for q in query.select_related('type'): 
    ok = True 
    for t in q.type.all(): 
     if t not in types: 
      ok = False 
      break 
    if ok: 
     questions.append(q) 
save_questions_in_m2m_relations_so_that_you_dont_have_to_repeat_this(questions) 

Assez maladroit, mais devrait faire ce dont vous avez besoin.

+0

En parlant de performance, est-il préférable de le faire uniquement en utilisant filter/exclude au lieu d'une itération sur une liste vérifiant que l'on est OK? – Arruda

+0

@Arruda: Filtrer/exclure fait tous les calculs dans la base de données, donc c'est toujours plus rapide, souvent par un facteur de dix. Mais je ne pouvais pas penser à une solution en pur filtre/exclure. Peut-être que vous pourriez le faire en SQL brut. Mais ** avant d'optimiser **, assurez-vous qu'il s'agit bien d'un goulot d'étranglement au niveau des performances. Vous pourriez économiser beaucoup de temps si ce n'est pas le cas. – jammon

+0

La raison principale que je veux savoir c'est parce que je veux apprendre comment faire face à un problème comme celui-ci ... cette résolution irait bien le problème que j'ai maintenant, mais peut-être à l'avenir je fais face à un autre qui ne peut être manipulé avec Querys donc je voulais savoir comment le faire de cette façon. – Arruda

Questions connexes