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 Make
s et chacun MakeContent
s où published = True
.
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 MakeContents
où published = True
, et la seconde consiste à récupérer tous les MakeContents
où published = 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/
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)
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.