2014-03-27 33 views
1

我想知道如何寫在Django查詢的連接條件下面的SQL查詢條件:如何寫加入Django的查詢

SELECT 
    s.name, 
    l.name, 
    a.name, 
    a.asset_code, 
    c.name, 
    ad.name, 
    a.model_no, 
    a.serial_no 
FROM 
    asset_mgmt_asset_assignment_employee ae, 
    asset_mgmt_asset a, 
    asset_mgmt_department ad, 
    asset_mgmt_employee e, 
    asset_mgmt_sublocation s, 
    asset_mgmt_location l, 
    asset_mgmt_asset_category c 
WHERE 
    ae.asset_id = a.id AND 
    ae.department_id = ad.id AND 
    ae.employee_id = e.id AND 
    ad.location_id = l.id AND 
    l.Sublocation_id = s.id AND 
    c.id = a.asset_category_id AND 
    s.id = 2; 

我們如何在Django查詢混合所有這些表?

+2

由該查詢返回的元組並不像您的任何表。 ORM如何將這些元組映射到對象中? – Kevin

回答

0

此查詢不會直接轉換爲Django。 Django查詢產生對象,而不是元組。你需要考慮對象及其關係而不是元組和關係。

當然,這是假設一個ORM適合您的用例。如果你發現自己寫了很多這樣的查詢,可能不會。如果您希望將所有業務邏輯保留在高級應用程序代碼中並將數據庫視爲對象的持久層,則ORM是最好的選擇。他們不擅長表達任意的查詢,比如這個。就我個人而言,我不太喜歡ORM。我寧願將大多數關係邏輯保存在視圖中,偶爾也會從應用程序代碼中查詢這些視圖(使用非常簡單的查詢)。但是這正在變成主觀意見。如果你想遵循類似MVC的框架,ORM確實有價值並且可以是有用的,而更多的關係解決方案通常會產生更少的分層代碼。

0

您不要在django目錄中寫入連接查詢。 Django有一個引擎,用於確定何時創建聯接,並且會爲您處理。

您的挑戰是爲他們之間的關係正確創建您的模型;然後讓ORM擔心創建查詢和表。

從上面的查詢中,下面是將其映射到ORM的一種可能方式,然後編寫相應的api調用以將所有相關對象提取到資產。當然不是一切都在這裏蓋,但它應該給你一個想法:

class Department(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
     return unicode(self.name) 

class Location(models.Model): 
    name = models.CharField(max_length=100) 
    parent = models.ForeignKey('self', blank=True, null=True) 

    def __unicode__(self): 
     return unicode(self.name) 

class AssetCategory(models.Model): 
    name = models.CharField(max_length=100) 

    def __unicode__(self): 
     return unicode(self.name) 

class Employee(models.Model): 
    name = models.CharField(max_length=100) 
    department = models.ForeignKey(Department) 

    def __unicode__(self): 
     return unicode(self.name) 

class Asset(models.Model): 
    name = models.CharField(max_length=100) 
    model_number = models.CharField(max_length=100) 
    serial_number = models.CharField(max_length=100) 
    employee = models.ForeignKey(Employee) 
    location = models.ForeignKey(Location) 
    category = models.ForeignKey(AssetCategory) 

那麼你的查詢是:

assets = Asset.objects.filter(location=Location.objects.get(id=2)) 
for asset in assets: 
    print('{0.id}, {0.name}, {0.model_number}, {0.serial_number}'.format(asset)) 
    print('{0.employee}, {0.employee.department}, {0.location}'.format(asset))