我使用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)
目前,我需要查询一组预订中使用的资源。我使用以下查询:
^{pr2}$我认为它与类似于此的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)或独占标志为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查询?在
也许你可以用Q objects来做这个。我对您的示例有一些问题,但是让我们用一个更简单的模型来看看。在
假设你想把所有的“多轮”车辆都放在车库里(例如,所有的摩托车和汽车,但没有独轮车),但是对于汽车,你只想要那些带有无级变速器的车辆,这意味着它们只有一个档位。(这是怎么回事,没有线索,但请你忍受我。。。;)以下内容应能给您提供:
^{pr2}$鉴于以下可用数据:
运行查询将为我们提供:
最后,为了使其适应您的情况,您可以使用以下代码:
例如,可以使用django游标进行查询
参见文档: https://docs.djangoproject.com/en/dev/topics/db/sql/
相关问题 更多 >
编程相关推荐