Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在django查询中编写连接条件_Python_Django Queryset_Django 1.4 - Fatal编程技术网

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

Python 如何在django查询中编写连接条件,python,django-queryset,django-1.4,Python,Django Queryset,Django 1.4,我想知道如何在django查询中为以下SQL查询编写连接条件: 选择 s、 名字, l、 名字, a、 名字, a、 资产代码, c、 名字, 广告名, a、 型号(编号), a、 序列号 从…起 资产管理资产分配员工ae, 资产管理资产a, 资产管理部门广告, 资产管理员工e, 资产管理子位置, 资产管理位置l, 资产管理资产c类 哪里 ae.asset_id=a.id和 ae.department_id=广告id和 ae.employee_id=e.id和 ad.location_id=l.

我想知道如何在django查询中为以下SQL查询编写连接条件:

选择 s、 名字, l、 名字, a、 名字, a、 资产代码, c、 名字, 广告名, a、 型号(编号), a、 序列号 从…起 资产管理资产分配员工ae, 资产管理资产a, 资产管理部门广告, 资产管理员工e, 资产管理子位置, 资产管理位置l, 资产管理资产c类 哪里 ae.asset_id=a.id和 ae.department_id=广告id和 ae.employee_id=e.id和 ad.location_id=l.id和 l、 子位置_id=s.id和 c、 id=a.资产\类别\ id和 s、 id=2;
如何在django查询中混合所有这些表?

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


当然,这首先是假设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)) 

此查询返回的元组与任何表都不一样。ORM将如何将这些元组映射到对象中?