2016-05-19 45 views
1

我有如下關係:如何反向查詢OnetoOne Django的

class Invoice(models.Model): 
    customer = models.OnetoOneField('Customer') 
    """ Other stuff """ 

class Customer(models.Model): 
    name = models.CharField() 
    """ Other stuff """ 

我的問題是:

如果我做一個查詢,讓我們說:

inv_q = Invoice.objects.filter(date=today())

我怎樣才能從此查詢中獲取所有相關客戶?

cus_q = Customer.objects.filter(id__in=inv_q.customer)

我一定要創建一個客戶經理是什麼?

編輯1:

我產生report.json文件必須包含的信息。爲了不碰到數據庫並獲取所有客戶,我希望獲得所選發票客戶的信息。

回答

2

你可以做以下操作:

cus_q = Customer.objects.filter(invoice__in=inv_q) 

,或者直接與field lookup

cus_q = Customer.objects.filter(invoice__date=today()) 
+0

我生成一個'report.json'文件必須同時包含信息(發票和客戶)。爲了不碰到數據庫並獲取所有客戶,我希望獲得所選發票客戶的信息。 –

+0

在這種情況下,您可以在另一個答案中使用@Sayse指出的'select_related'。 – AKS

+0

但是在這種情況下,我將無法一次檢索所有客戶,對嗎?看來我必須通過每個對象來獲取客戶。 –

1

它並不完全意義的你正在嘗試做的,你可以使用一個字段查詢按發票日期過濾客戶

Customer.objects.filter(invoice__date=today()) 

這似乎是最合適的

否則,你可以使用select_related預檢索客戶模式每張發票,然後通過invoice_instance.customer訪問時將不會有進一步的查詢

Invoice.objects.filter(date=today()).select_related('customer') 
+0

我正在生成一個'report.json'文件,其中必須包含兩個信息(發票和客戶)。爲了不碰到數據庫並獲取所有客戶,我希望獲得所選發票客戶的信息。查詢必須由發票製作,從這一點開始,當生成報告時,顧客必須走到一起。 –

+0

@Ev。 - 我從來沒有使用過'report.json',所以我不知道如何序列化(或工作)。 'select_related'雖然停止了第二個查詢。 – Sayse

+0

是否有可能在一個對象/查詢中獲得與發票查詢相關的所有客戶?我將把發票和客戶的信息打印到一個文件中,做一些後期處理。這就是爲什麼我需要整個客戶表的轉儲(與我所提到的相關的所選發票)。 –