2014-03-27 58 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))