Django查询:相关子查询

时间:2014-07-14 20:45:07

标签: sql django subquery django-queryset

我有3个型号:优惠,请求和分配。分配在请求和要约之间建立连接。现在我想这样做:

select *
from offer as a
where places > (
    select count(*)
    from assignment
    where offer_id = a.id and
    to_date > "2014-07-07");

我不确定如何使用django QuerySet实现这一点...任何提示?

编辑:上面的查询只是一个例子,一般来说查询应该是什么样子。 django模型看起来像这样:

class Offer(models.Model):
    ...
    places = models.IntegerField()
    ...

class Request(models.Model):
    ...

class Assignment(models.Model):
    from_date = models.DateField()
    to_data = models.DateField()
    request = models.ForeignKey("Request",related_name="assignments")
    offer = models.ForeignKey("Offer",related_name="assignments")

人们现在可以创建具有给定数量的地点或请求的要约。然后,管理员将在给定时间内将请求与要约连接起来。这将保存为作业。上面的查询应该会给我一个优惠清单,其中还有剩下的地方。因此,我想计算给定报价的有效分配数,以将其与其位数进行比较。此列表应用于查找给定请求创建新分配的可能要约。

我希望这能更好地描述问题。

2 个答案:

答案 0 :(得分:0)

不幸的是,ORM操作不直接支持相关子查询。在这种情况下,应该可以使用.extra(where=...)

要在不使用子查询的情况下获得相同的结果,以下内容应该起作用:

Offer.objects.filter(
    assignment__to_date__gt=thedate
).annotate(
    assignment_cnt=Count('assignment')
).filter(
    assignment_cnt__lte=F('places')
) 

确切的查询取决于模型定义。

答案 1 :(得分:-1)

query = '''select *
from yourapp_offer as a
where places > (
    select count(*)
    from yourapp_assignment
    where offer_id = a.id and
    to_date > "2014-07-07");'''

offers = Offer.objects.raw(query):

https://docs.djangoproject.com/en/1.6/topics/db/sql/