【问题标题】:How to write join conditions in django query如何在 django 查询中编写连接条件
【发布时间】:2014-03-27 08:15:38
【问题描述】:

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

【问题讨论】:

  • 此查询返回的元组看起来不像您的任何表。 ORM 将如何将这些元组映射到对象中?

标签: python django-queryset django-1.4


【解决方案1】:

这个查询不能直接翻译成 Django。 Django 查询产生对象,而不是元组。您需要考虑对象及其关系,而不是元组和关系。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-05-22
      • 2018-10-08
      • 2021-06-14
      • 2016-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-11
      相关资源
      最近更新 更多