web-dev-qa-db-fra.com

Django Queryset avec filtrage sur la clé étrangère inverse

J'ai le modèle Django suivant:

class Make:
   name = models.CharField(max_length=200)

class MakeContent:
   make = models.ForeignKey(Make)
   published = models.BooleanField()

J'aimerais savoir s'il est possible (sans écrire directement SQL) pour moi de générer un ensemble de requêtes qui contient tous les Makes et chacun MakeContents où published = True.

53
Julian A.

Django ne prend pas en charge la méthode select_related() pour les recherches de clé étrangère inversée, donc le mieux que vous puissiez faire sans quitter Python est deux requêtes de base de données. La première consiste à saisir toutes les Makes contenant MakeContentspublished = True, et la seconde consiste à récupérer tous les MakeContentspublished = True. Vous devez ensuite parcourir et organiser les données comme vous le souhaitez. Voici un bon article sur la façon de procéder:

http://blog.roseman.org.uk/2010/01/11/Django-patterns-part-2-efficient-reverse-lookups/

11
Spike

Oui, je pense que tu veux

make = Make.objects.get(pk=1)
make.make_content_set.filter(published=True)

ou peut-être

make_ids = MakeContent.objects.filter(published=True).values_list('make_id', flat=True)
makes = Make.objects.filter(id__in=make_ids)
58
Jason Christa

Je sais que c'est une très vieille question, mais je réponds. Comme je pense que ma réponse peut aider les autres. J'ai changé un peu le modèle comme suit. J'ai utilisé Django 1.8.

class Make(models.Model):
    name = models.CharField(max_length=200)

class MakeContent(models.Model):
    make = models.ForeignKey(Make, related_name='makecontent')
    published = models.BooleanField()

J'ai utilisé le jeu de requêtes suivant.

Make.objects.filter(makecontent__published=True)

J'espère que cela vous aidera.

14
user1012513