2017-09-05 16 views
0

是否可以將相關字段的行傳遞到django數據庫函數中,如果有的話,我該如何實現?當我嘗試時,我最終得到一個整數(id列)而不是行。將相關行傳遞給Django數據庫函數

型號:

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 
    ) 

期望中的查詢集:

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

我的目標是到fkobj通過行到DatabaseFn使得連接是通過查詢集進行一次,而不是每個註釋內。

這是甚至可能在Django?現在,我從我的postgres函數中得到一個錯誤,說它收到一個整數而不是一行,這表示django沒有執行額外的連接。任何有識之士將不勝感激,謝謝。

環境Django v1.10.3, python 2.7, postgresql 9.5

回答

0

也許你正在尋找的下劃線符號。事情是這樣的:

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

或者周圍的其他方式:

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

這些查詢都是一個往返到數據庫。在外鍵情況下,它將返回一行所需的列。在許多情況下,它會爲每個現有關係返回一行,並與您用下劃線表示法選擇的列相關聯。

我跳這有助於

+0

感謝您的回覆,但這是我在我的示例中顯示的語法,它不工作。問題是我不想枚舉每一列(如你的第二個例子),我想要m2m相關對象的外鍵相關對象。您的解決方案將產生m2m對象的字段或我看到的fk對象字段 – chukkwagon

+0

。我會對一個不需要列舉所有列的答案感興趣。在這裏等待;)。對於第二條評論,您可以繼續使用雙下劃線來獲得與m2m對象相關的fk:ModelA.objects.all()。values('m2mrelatedobj__ModelC1_FK_name__FK_filed_name')。乾杯! – Tico