2017-06-22 2 views
0

Mes modèles sont les suivants:la requête d'un grand nombre à plusieurs champs de table référencée à l'aide ORM

class AppUser(models.Model): 
    id = models.AutoField(primary_key=True) 
    user = models.OneToOneField(User) 
    states = models.ManyToManyField(State) 

class ABC(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 
    app_user = models.ForeignKey(AppUser, null=True, blank=True) 

Je veux interroger ma base de données pour la liste des objets présents dans le modèle ABC et je veux filtrer selon la liste d'États.

Je suis en train quelque chose comme ceci:

ABC.objects.filter(app_user__states__in = state_list).values('id','name') 

Mais cela ne fonctionne pas. Est-ce que je peux même accéder à beaucoup de champ comme ceci ou ai-je besoin de créer un tableau de coutume à travers.

Répondre

0

Oui, vous pouvez.

Pour queryset:

ABC.objects.filter(app_user__states__in = [1,2]).values('id', 'name') 

vous obtiendrez sql comme ceci:

>>> print(ABC.objects.filter(app_user__states__in = [1,2]).values('id', 'name').query) 

SELECT "test_abc"."id", "test_abc"."name" 
FROM "test_abc" 
INNER JOIN "test_appuser" ON ("test_abc"."app_user_id" = "test_appuser"."id") 
INNER JOIN "test_appuser_states" ON ("test_appuser"."id" = "test_appuser_states"."appuser_id") 
WHERE "test_appuser_states"."state_id" IN (1, 2); 

a l'air bien. Peut-être que cela ne fonctionne pas comme prévu?