如何在django查询中编写连接条件

时间:2014-03-27 08:15:38

标签: python django-queryset django-1.4

我想知道如何在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查询中混合所有这些表?

2 个答案:

答案 0 :(得分:0)

此查询不能直接转换为Django。 Django查询生成对象,而不是元组。你需要考虑对象及其关系而不是元组和关系。

当然,假设ORM首先适合您的用例。如果你发现自己写了很多像这样的查询,那可能就不是了。如果要将所有业务逻辑保留在高级应用程序代码中并将数据库视为对象的持久层,则ORM最佳。他们不善于表达像这样的任意查询。就个人而言,我并不喜欢ORM。我宁愿在视图中保留大多数关系逻辑,偶尔也会从应用程序代码中查询这些视图(使用非常简单的查询)。但这是主观意见。 ORM确实有价值,如果你想要遵循类似MVC的框架,它会很有用,而更多的关系解决方案通常会产生更少的分层代码。

答案 1 :(得分: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))