栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Django左外部联接

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Django左外部联接

首先,没有一种方法(atm Django 1.9.7)可以 _ 完全* _按照您的意愿使用 发布的原始查询的 Django ORM
表示形式;但是,您可以通过以下方式获得相同的预期结果: _
*_

>>> Topic.objects.annotate(        f=Case( When(     record__user=johnny,      then=F('record__value') ),  output_field=IntegerField()        )    ).order_by(        'id', 'name', 'f'    ).distinct(        'id', 'name'    ).values_list(        'name', 'f'    )>>> [(u'A', 1), (u'B', None), (u'C', 3)]>>> Topic.objects.annotate(f=Case(When(record__user=may, then=F('record__value')), output_field=IntegerField())).order_by('id', 'name', 'f').distinct('id', 'name').values_list('name', 'f')>>> [(u'A', 4), (u'B', 5), (u'C', 6)]

这里是为第一个查询生成的SQL:

>>> print Topic.objects.annotate(f=Case(When(record__user=johnny, then=F('record__value')), output_field=IntegerField())).order_by('id', 'name', 'f').distinct('id', 'name').values_list('name', 'f').query>>> SELECt DISTINCT ON ("payments_topic"."id", "payments_topic"."name") "payments_topic"."name", CASE WHEN "payments_record"."user_id" = 1 THEN "payments_record"."value" ELSE NULL END AS "f" FROM "payments_topic" LEFT OUTER JOIN "payments_record" ON ("payments_topic"."id" = "payments_record"."topic_id") ORDER BY "payments_topic"."id" ASC, "payments_topic"."name" ASC, "f" ASC

一些注意事项

  • 毫不犹豫地使用原始查询,特别是在性能 重要的情况下。而且,有时候这是必须的,因为使用Django的ORM无法获得相同的结果。在其他情况下,您可以这样做,但是偶尔拥有清晰易懂的代码比 这段 代码的性能更为重要。
  • distinct
    此答案中使用带位置参数的参数,仅适用于PostgreSQL atm。在文档中,您可以了解有关条件表达式的更多信息。


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/652224.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号