【问题标题】:django : How to write alias in querysetdjango:如何在查询集中编写别名
【发布时间】:2011-07-26 17:07:59
【问题描述】:

如何为 django 查询集中的列名编写别名。 对于将两个链接字段与同一个外部模型进行联合样式组合(例如)很有用。

例如在 mysql 中:

select m as n, b as a from xyz

我如何在 django 查询集中做到这一点?

models.Table.objects.all().values('m', 'b')

任何帮助都非常感谢。

【问题讨论】:

  • 我真的很惊讶它是可能的。 Django 与普通 SQL 的区别在于,字段映射到 Django 中的 Model 上的字段,而对返回 SQL 的名称没有限制。即使您可以给字段名称起别名,也会破坏模型中的功能。
  • 为什么我有这个要求,因为,使用 ORM 从两个表中进行查询,因为我有一个输出,作为 a = [{name: 'ab', am: 'xy'}, {a_name :'ab',下午:'mm'}]。这里 name 和 a_name 作为相同的值但键不同,所以我教如果我将字段值设为别名,那么我可以获得 {name: 'ab', pm: 'mm'}

标签: django django-models


【解决方案1】:

您可以根据需要使用F expression 对字段进行注释:

from django.db.models import F

models.Table.objects.all().values('m', 'b').annotate(n=F('m'), a=F('b'))

【讨论】:

    【解决方案2】:

    虽然之前可以使用 extra(select={'n':'m','a':'b'}) 完成此操作,但我同意这确实应该是 values() 本身的一部分。

    为此,受 Alex 的票的启发,我有 just postedpatch 添加了此功能。我希望你会发现它有用!

    【讨论】:

    • 在 django 1.4 中的值看起来像上面提到的额外不起作用
    • 这个补丁真的有用过吗?
    【解决方案3】:

    您在评论中的理由毫无意义。模型中的每个字段在数据库中都有自己的列,并且永远不会有混淆它们的危险。您当然可以告诉字段使用与字段名称不同的列名称:

    myfield = models.CharField(max_length=10, db_column='differentname')
    

    但我不知道这是否对你有帮助,因为我仍然不知道你的问题是什么。

    【讨论】:

      【解决方案4】:

      我认为这是不可能的,所以我提出了要添加该功能的票,我认为能够做到这一点是有一些优点的。详情请查看票证。

      https://code.djangoproject.com/ticket/16735

      【讨论】:

        【解决方案5】:

        我真的无法理解您要做什么,但是听起来您正在寻找的是extra queryset 方法。在大多数情况下,这与 AS 在 sql 中的行为方式相同。

        【讨论】:

          猜你喜欢
          • 2019-07-30
          • 2021-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 2018-04-11
          相关资源
          最近更新 更多