2014-03-29 47 views
0

我有以下模式:Django的ORM跨產品

class PCs(models.Model): 
    model = models.ForeignKey(Products, primary_key=True) 
    speed = models.IntegerField(max_length=256, blank = True, null=True) 
    ram = models.IntegerField(max_length=256, blank = True, null=True) 
    hd = models.IntegerField(max_length=256, blank = True, null=True) 
    price = models.IntegerField(max_length=256, blank = True, null=True) 


class Printers(models.Model): 
    model = models.ForeignKey(Products, primary_key=True) 
    color = models.BooleanField() 
    type = models.CharField(max_length=256, blank = True, null=True) 
    price = models.IntegerField(max_length=256, blank = True, null=True) 

我試圖運行下面的SQL查詢:

SELECT * 
FROM PCs P, Printers T 
WHERE p.price + t.price <= 1000 

但我對如何做到這一點完全喪失用Django的ORM。是唯一的方法來做到這一點,但從PC和打印​​機獲取所有對象,並檢查所有可能的組合?

+0

有點挑剔,但模型名稱應按照慣例單數。 –

回答

0

ORM:

pcs = PCs.objects.filter(price__lte=1000) 
printers = Printers.objects.filter(price__lte=1000) 

pcsprinter我們可以找到問題的答案。 而我們的SQL查詢是不正確的。 或者製作一個related_name,並從產品中進行一個查詢。

+0

這與我提供的SQL查詢不一樣。這只是得到個人電腦和打印機,其中每個價格低於1000.我想要兩個表的交叉產品,其中電腦的價格和打印機的價格之和小於1000 –

+0

我明白這一點。但這是Django ORM。 – Wolkodav

+0

看django連接執行,可能會有所幫助。或者使用另一個ORM。 – Wolkodav

0

可能的解決方案是使用原始SQL,請參閱文檔here

不幸的是,Django的ORM並沒有提供一個乾淨的方式來加入兩個沒有某種關係的表。僅僅因爲它不乾淨並不意味着你無法做到!

請注意,我實際上不知道你的原始sql表名是什麼,所以你必須自己填寫。如果我不得不猜測他們會是app_name_p_csapp_name_printers。你可以使用./manage.py dbshell去找出。

你可以嘗試這樣的:

pcs = PCs.objects.raw(
    "SELECT " 
    " pc_table.model_id, " 
    " pc_table.speed, " 
    " pc_table.ram, " 
    " pc_table.hd, " 
    " pc_table.price, " 
    " printer_table.model_id as printer_model_id, " 
    " printer_table.color as printer_color, " 
    " printer_table.type as printer_type, " 
    " printer_table.price as printer_price " 
    "FROM " 
    " pc_table, printer_table " 
    "WHERE " 
    " pc_table.price + printer_table.price <= 1000 " 
) 

pairs = [] 
for pc in pcs: 
    printer = Printers(
     model_id=pc.printer_model_id, 
     color=pc.printer_color, 
     type=pc.printer_type, 
     price=pc.printer_price, 
    ) 
    pairs.append((pc, printer)) 

正如你可以看到,從打印機領域多餘的值都只是上漲到計算機上對象,你用你的ORM查詢得到,你只需要構建之後手動打印機對象。我認爲爲查詢命名打印機字段是一個好主意,以便ORM不會將它們混淆在pc字段中。

另請注意,取決於您打算如何處理此查詢的結果,甚至可能根本沒有必要構建完全爲Printers的對象。