2011-05-06 10 views
1

Mes modèles:Django - Obtenir la liste des articles avec un filtre

Item: 
    name 
    desc 

Type: 
    name 

Value: 
    text 
    type.ForeignKey(Type) 
    item = ForeignKey(Item) 

J'ai eu une première liste de types de type de table, supposons que t = [4,5,6]. Maintenant, je dois obtenir une liste d'éléments dont les types sont t. Par exemple:

Liste des données de la valeur:

type | item 
4  1 
5  1 
6  1 
4  2 
5  2 
4  3 

Donc, si t = [4,5,6], le résultat est que je dois que items = [<object: 1>]

MISE À JOUR:

t = [4,5] items = [<object: 1>, <object: 2>]

t = [4] items = [<object: 1>, <object: 2>, <object: 3>]

Merci pour toute aide !!!

+0

Ma solution fonctionne exactement comme vous le souhaitez (dans la section mise à jour aussi). Ou pas? – DrTyrsa

+0

Je vais tester :) Merci mon ami! – anhtran

Répondre

2

Pas tout à fait sûr que ce soit la meilleure solution, mais il fonctionne

from itertools import groupby 

values = Value.objects.filter(type_id__in=t).values_list('type_id', 'item_id') 
values = sorted(values, key=lambda x: x[1]) 

items = [] 
for key, group in groupby(values, lambda x: x[1]): 
    types = [x[0] for x in group] 
    if set(t).issubset(set(types)): 
     items.append(key) 

items se containd ids, pas des objets, mais je ne pense pas qu'il peut être un problème.

1

Vous pouvez filtrer à travers un grand nombre à plusieurs relation qui est la valeur:

Item.objects.filter(value__type__id__in = [4, 5, 6]) 

Mise à jour: Ce qui précède travailler pour une requête ou, pour trouver tous les articles qui a l'un des types spécifiés. Pour trouver tous les éléments qui ont TOUS les types, vous devez créer une requête AND en enchaînant les filtres:

q = Item.objects 
for id in [4, 5, 6]: 
    q = q.filter(value__type__id = id) 
print q.all() 
# or 
q = reduce(lambda q, i: q.filter(value__type__id = i), [4, 5, 6], Item.objects) 
print q.all() 
+1

Et obtenir des éléments qui ont des types [4], [4, 5], [5, 6] etc Mais la tâche est différente. – DrTyrsa

+0

Vous avez raison. J'ai mal lu la question. –

Questions connexes