Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.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_Sql_Django - Fatal编程技术网

Python Django高级查询

Python Django高级查询,python,sql,django,Python,Sql,Django,我正在使用Django ORM处理我的数据库查询。我有以下数据库表: 资源 资源库 资源池要素 保留地 以及以下型号: class Resource(models.Model): name = models.CharField(max_length=200) class Reservation(models.Model): pass class ResourcePool(models.Model): reservation = models.ForeignKe

我正在使用Django ORM处理我的数据库查询。我有以下数据库表:

  • 资源
  • 资源库
  • 资源池要素
  • 保留地
以及以下型号:

class Resource(models.Model):

    name = models.CharField(max_length=200)

class Reservation(models.Model):
    pass

class ResourcePool(models.Model):

    reservation = models.ForeignKey(Reservation, related_name="pools", db_column="reservation")
    resources = models.ManyToManyField(Resource, through="ResourcePoolElem")
    mode = models.IntegerField()

class ResourcePoolElem(models.Model):

    resPool = models.ForeignKey(ResourcePool)
    resource = models.ForeignKey(Resource)
目前,我需要查询一组预订中使用的资源。我使用以下查询:

resourcesNames = []
reservations = []
resources = models.Resource.objects.filter(
    name__in=resourcesNames, resPool__reservation__in=reservations).all()
我认为这与类似于此的sql查询相匹配:

select *
from resource r join resource_pool rp join resource_pool_elem rpe join reservation reserv 
where r.id = rpe.resource and  
  rpe.pool = rp.id and
  reserv.id = rp.reservation and
  r.name in (resourcesNames[0], ..., resourcesNames[n-1])
  reserv.id in (reservations[0], ..., reservations[n-1])
现在,我想给这个查询添加一个限制。每个池可能有一个独占模式布尔标志。将有一个额外的输入列表,其中包含每个池的请求独占标志,我只想在exclusive=true时查询与请求独占标志匹配的池资源,或者查询exclusive标志为false的池资源。我可以使用类似以下代码的Python构建SQL查询:

query = "select * 
    from resource r join resource_pool rp join resource_pool_elem rep
    join reservation reserv 
    where r.id = rpe.resource and  
    rpe.pool = rp.id and 
    reserv.id = rp.reservation and 
    reserv.id in (reservations[0], ..., reservations[n-1]) and ("
for i in resourcesNames[0:len(resourcesNames)]
    if i > 0:
        query += " or "
    query += "r.name = " + resourcesNames[i]
    if (exclusive[i])      
        query += " and p.mode == 0"
query += ")"    

有没有一种方法可以在Django查询中表示此sql查询?

也许您可以使用。围绕您的示例,我有一些问题,但让我们用一个更简单的模型来看看

class Garage(models.Model):
    name     = models.CharField()

class Vehicle(models.Model):
    wheels   = models.IntegerField()
    gears    = models.IntegerField()
    garage   = models.ForeignKey(Garage)
假设您希望在车库中安装所有“多轮”车辆(例如,所有摩托车和汽车,但没有独轮车),但对于汽车,您只希望安装CVT变速箱,这意味着它们只有一个档位。(这件事是怎么发生的,没有线索,但请耐心听我说……;)下面应该告诉你:

from django.db.models import Q
garage = Garage.objects.all()[0]
query = Vehicle.objects.filter(Q(garage=garage))
query = query.filter(Q(wheels=2) | (Q(wheels=4) & Q(gears=1)))
鉴于以下可用数据:

for v in Vehicle.objects.filter(garage=garage):
    print 'Wheels: {}, Gears: {}'.format(v.wheels, v.gears)

Wheels: 1, Gears: 1
Wheels: 2, Gears: 4
Wheels: 2, Gears: 5
Wheels: 4, Gears: 1
Wheels: 4, Gears: 5
运行查询将为我们提供:

for v in query:
    print 'Wheels: {}, Gears: {}'.format(v.wheels, v.gears)

Wheels: 2, Gears: 4
Wheels: 2, Gears: 5
Wheels: 4, Gears: 1
最后,为了使其适应您的情况,您可以使用以下内容:

query = models.Resource.objects.filter(Q(resPool__reservation__in=reservations))
query = query.filter(Q(name__in(resourcesNames))
query = query.filter(Q(resPool__exclusive=True) & Q(resPool__mode=0))

例如,您可以使用django游标进行查询

见文件:

from django.db import connection

def my_custom_sql(self):
    cursor = connection.cursor()

    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])

    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()

    return row