2014-10-20 26 views
0

我一直在尋找到Django的連接返回的每個ID,我可以看到我怎麼能選擇具有.select_related相關的領域,但我似乎無法讓它按照我的想法工作。我基本上擁有與customer_id FK鏈接到客戶表的彙總表,我想從客戶字段中爲每個摘要返回的每個值選擇客戶名稱。如何使用Django的加入來選擇CUSTOMER_NAME對於在結果

我包含僞代碼來顯示即時消息試圖做什麼。

sql would be = ''' select a.customer_name, b.vm_name, b.vm_cpu, b.vm_mem from customers a, vms b where a.customer_id = b.customer_id''' 

我該如何與django做到這一點。這樣,當我遍歷返回的值

for value in sql: 
    list.append(value.1, value.2, value.3) 

這樣我可以關聯和輸出與各領域的CUSTOMER_NAME。

繼承人是我想要做的事:

compute_usages_related = ComputeUsages.objects.filter(customer_id = customer_id).filter(load_date = datetime(year, day, selected_month)).select_related('customer_name') 
test_related = [] 
for row in compute_usages_related: 
    test_related.append(row.customer_name) 

顯然不起作用。

基本上是一個爲特定的客戶,但其中公司員工擁有管理員權限可以查詢所有客戶的整個數據庫,並創建一個使用報告,所以我需要customer_names與查詢相關聯的情況。

有關如何使用django做到這一點的任何想法?

型號:

class Customers(models.Model): 
    customer_id = models.BigIntegerField(primary_key=True, editable=False) 
    customer_name = models.CharField(max_length=100) 
    inactive = models.CharField(max_length=1) 
    datetime = models.DateTimeField() 
    class Meta: 
     managed = True 
     db_table = 'customers' 

    def __unicode__(self): # Python 3: def __str__(self): 
     return self.customer_name 

    def clean(self): 
     if self.inactive != 'Y' and self.inactive != 'N': 
     raise ValidationError('Please enter a Y or N') 

class ComputeUsages(models.Model): 
    compute_usage_id = models.AutoField(primary_key=True, editable=False) 
    customer = models.ForeignKey(Customers) 
    vm_name = models.CharField(max_length=4000) 
    vm_id = models.BigIntegerField() 
    core_hours = models.DecimalField(max_digits=15, decimal_places=2) 
    ram_hours = models.DecimalField(max_digits=15, decimal_places=2) 
    guest_os = models.CharField(max_length=100) 
    provisioned_cores = models.BigIntegerField() 
    provisioned_ram = models.BigIntegerField() 
    load_date = models.DateField() 
    datetime = models.DateTimeField() 

    class Meta: 
     managed = True 
     db_table = 'compute_usages' 

    def __unicode__(self): # Python 3: def __str__(self): 
     return self.vm_name 
+0

您應該顯示模型。 – 2014-10-20 16:34:01

+0

@DanielRoseman doneski,請讓我知道你在想什麼。我正在嘗試關注文檔,但對於這個主題不太清楚。 – 2014-10-20 16:39:11

+0

我相當確定,當我循環返回的計算使用情況時,我可以通過返回的id在該行中找到客戶ID,但我想按照django的方式進行操作。 – 2014-10-20 16:41:25

回答

1

可以已經做到以下幾點,沒有任何使用select_related

test_related.append(row.customer.customer_name) 

因爲只是用您已經定義的字段。但是,這樣做效率很低,因爲它會爲每一行生成一個新的數據庫查詢。所有select_related確實是通過對客戶表執行JOIN來預緩存該值。再次注意,它是你正在查詢的表格,而不是列:

compute_usages_related = ComputeUsages.objects....select_related('customer') 

(爲了清楚起見,我已經刪除了過濾條款)。再次,訪問列的方式不會改變:您仍然在做row.customer.customer_name,只是它不再執行額外的數據庫查詢。

這都將是你更清晰了很多,如果你開始在車型方面思想爲類,而不是SQL查詢。另外,你應該真的利用Python shell來探索你的對象的屬性。

+0

非常感謝,我試圖通讀文檔來獲取句柄,但它有點令人生畏。你剛剛幫了我很大的忙。謝謝。 – 2014-10-20 17:15:16