【问题标题】:How to generate django ORM code for below query?如何为以下查询生成 django ORM 代码?
【发布时间】:2013-12-04 09:24:16
【问题描述】:

我想为下面的查询生成 ORM 代码。

我的模特:

class tbl2(models.models):
    code1 = models.CharField()

class tbl1(model.models):
    x = models.CharField()
    y1 = models.ForeignKey(tbl2)
    y2 = models.ForeignKey(tbl2)
    amount = models.integerField()

查询

select p1.x, sum(p1.amount) from tbl1 p1, 
          tbl1 p2
          where p2.y1 = p1.referred_by_id 
          group by p1.x;         

【问题讨论】:

  • p1 没有“电子邮件”属性。我相信您切换了表名并忘记了 sql 中的某些内容。
  • @furins Thnx 我改了。
  • 我试着更正一点。我不明白声明 p1.y1 = p2.referred_by_id 的意义,因为 p2 从未使用过,也没有办法获取它的实例(=ID)
  • @furins 其实我想做自我加入。

标签: django django-models django-orm


【解决方案1】:

编辑:我不太了解您的查询,它与您的类定义有何关系,尤其是您如何确保 tbl1 实例的 ID 可以匹配 tbl2。也许您可以在问题中添加一些内容来改进它?我观察到的是 p2.y1 指的是 class tbl2 而不是 tbl1 的实例,所以这不是自指。

但是,只需将您的 SQL 代码翻译成可以在 django 上运行的代码,就会得到以下代码:

from django.db.models import Sum
from django.db.models import F

tbl1.objects.filter(y1__id=F('id')).values('x').annotate(sum_amount=Sum('amount'))

但我相信你在类定义中的意思有所不同,也许:

class tbl1(model.models):
    x = models.CharField()
    y1 = models.ForeignKey(self)
    y2 = models.ForeignKey(self)
    amount = models.integerField()

我提供的查询集也适用于第二种情况。

聚合类参考:http://docs.djangoproject.com/en/dev/topics/db/aggregation/#topics-db-aggregation

F() 函数参考: https://docs.djangoproject.com/en/dev/ref/models/queries/#django.db.models.F

模型中的自我参考参考: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.ForeignKey


旁注:类名应为Capitalized

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 2017-09-10
    • 2019-12-12
    • 2013-02-25
    • 2021-11-25
    • 2021-12-16
    • 1970-01-01
    • 2015-07-21
    • 2019-10-17
    相关资源
    最近更新 更多