2014-04-24 5 views
0

D'accord existe-t-il un moyen de filtrer les objets afin que vous n'obteniez que des enregistrements avec des enregistrements associés. Est-ce une bonne adhésion peut-être? Fondamentalement, je veux seulement sélectionner des enregistrements de A que B a une clé étrangère pour tout en utilisant une clause WHERE sur B. Est-ce que je rends le son plus compliqué que c'est? Je n'ai pas besoin des enregistrements de B, juste le A; peut-être une sous-requête?Comportement des relations de requête Django

Je suis relativement nouveau dans les requêtes de Django et je viens de faire quelques-unes des choses les plus simples.

+0

pourriez-vous donner un exemple spécifié? –

+0

Filtrer l'objet A afin qu'il n'obtienne que les enregistrements avec une relation à B et B est le modèle avec la clé étrangère à A – Callum

+0

il y a deux façons de le faire (bien que je ne me souvienne pas exactement du second). La méthode la plus simple consiste à utiliser A.objects.filter (id__in = B.objects.filter (votre filtre personnalisé) .values_list ('a', flat = True)). C'est une sorte de sous-requête. Je vais essayer de rappeler la deuxième manière. –

Répondre

1

Votre question est un peu vague, mais si je vous comprends bien cela fonctionnerait comme ceci:

class A(models.Model): 
    pass 

class B(models.Model): 
    a = models.ForeignKey(A) 
    some_field = models.IntegerField() 

a.filter(b__some_field=5).distinct() 

Ce JOINs les deux tables et des filtres sur l » some_fieldb. Puis, distinct() s'assure que seuls les a uniques sont renvoyés. Voir la documentation au lookups that span relationships.

0

Ma solution était beaucoup plus simple que je pensais initialement. Je ne savais pas que vous pouviez filtrer les modèles associés si facilement. Voici ce que j'ai fini avec:

class A(models.Model): 
    pass 

class B(models.Model): 
    a = models.ForeignKey(A) 
    location = models.ForeignKey(Location) 

a.filter(b__location=request.user.profile.location)