2009-11-30 5 views
1

Je voudrais trouver comment sélectionner tous les objets dont le champ ManyToMany contient un autre objet. Je les modèles suivants (dépouillées vers le bas)Requête de base de données à travers django ManyToManyField

class Category(models.Model): 
    pass 

class Picture(models.Model): 
    categories = models.ManyToManyField(Category) 
    visible = models.BooleanField() 

je besoin d'une fonction pour sélectionner toutes les images dans une ou plusieurs catégories:

def pics_in_cats(cat_ids=()): 
    pass 

mais il a besoin de retourner un QuerySet si possible pour que je peut faire quelque chose comme:

pics_in_cats((1,2,3)).filter(visible=True) 

cela pourrait se faire en chargeant tous les objets pertinents Catégorie et la fusion de leurs attributs de picture_set, mais cela semble inefficace. Je voudrais également éviter de retomber dans le SQL brut si possible.

Merci à l'avance

Répondre

3

Pourquoi écrire une fonction personnalisée et ne pas utiliser quelque chose comme ça? (Non testé)

pics = Picture.objects.filter(categories__in = [1,2,3]).filter(visible=True) 
+0

qui fonctionne - mais je ne sais pas pourquoi :) Est-ce dire « où une clé primaire de la catégorie correspond à l'un 1,2,3 »? Et puis-je dire filter (categories__name__in = ['foo', 'bar']) par exemple pour obtenir toutes les images dans les catégories avec le nom foo ou bar? –

+0

c'est correct. Pour voir toutes les possibilités que vous avez dans les requêtes de construction Django, regardez ici: http://docs.djangoproject.com/fr/dev/topics/db/queries/ – schneck

Questions connexes