簡體   English   中英

如何在Django查詢中編寫聯接條件

[英]How to write join conditions in django query

我想知道如何在Django查詢中為以下SQL查詢編寫連接條件:

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查詢中混合所有這些表?

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

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

您不要在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)) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM