2017-09-05 3 views
0

Est-il possible de passer des lignes de champs connexes dans les fonctions de base de données django et si oui, comment puis-je accomplir cela? Quand j'essaye, je finis par obtenir un nombre entier (la colonne d'identification) au lieu de la rangée.Passage de ligne connexe à la fonction de base de données Django

Modèles:

class ModelA(models.Model): 
    pass 


class ModelB(models.Model): 
    pass 


class ModelC(models.Model): 
    model_a_rel = models.ManyToManyField(
     ModelA, 
     related_name='m2mrelatedobj' 
    ) 
    fkobj = models.ForeignKey(
     ModelB 
    ) 

queryset désiré:

ModelA.objects.annotate(
    my_annotation=DatabaseFn('m2mrelatedobj__model_a_rel') 
).filter(my_annotation=True) 

Mon but est de passer lignes de fkobj en DatabaseFn de sorte que la jointure se fait une fois au queryset et pas à l'intérieur de chaque annotation .

Est-ce encore possible dans django? En ce moment, je reçois une erreur de ma fonction postgres disant qu'il a reçu un nombre entier au lieu d'une ligne, qui communique que django ne fait pas la jointure supplémentaire. Toute idée serait très appréciée, merci.

environnement: Django v1.10.3, python 2.7, postgresql 9.5

Répondre

0

Peut-être que vous cherchez la notation underscore. Quelque chose comme ceci:

ModelC.objects.all().values('model_a_rel__field_ModelA1_name','model_a_rel__field_ModelA2_name','fkobj__ModelB1_field_name') 

Ou l'inverse:

ModelA.objects.all().values('m2mrelatedobj__ModelC1_field_name') 

Ces requêtes sont un aller-retour à la base de données. Dans le cas de clé étrangère, il retournera une ligne avec les colonnes souhaitées. Dans le cas de plusieurs à plusieurs, il retournera une ligne pour chaque relation existante avec les colonnes que vous avez choisies avec la notation de soulignement.

Je hop cette aide

+0

Merci pour la réponse, mais est la syntaxe que je montre dans mon exemple qui ne fonctionne pas. Le problème est que je ne veux pas énumérer chaque colonne (comme dans votre deuxième exemple), et je veux des objets liés à la clé étrangère de l'objet lié m2m. Votre solution donnera des champs de l'objet m2m ou des champs de l'objet fk – chukkwagon

+0

je vois. Je serais très intéressé par une réponse qui n'a pas besoin d'énumérer toutes les colonnes aussi. En attendant ça ici;). Pour la deuxième remarque, vous pouvez continuer à faire double trait de soulignement pour obtenir fk lié à l'objet m2m: ModelA.objects.all(). Values ​​('m2mrelatedobj__ModelC1_FK_name__FK_filed_name'). À votre santé! – Tico