私信  •  关注

Endre Both

Endre Both 最近创建的主题
Endre Both 最近回复了
5 年前
回复了 Endre Both 创建的主题 » 具有相同值的字段上的Django ORM LEFT JOIN

您可以实现您想要的目标,但这将是不必要的低效(甚至比您发布的SQL查询还要低效)。由于您当前的模型结构是相当扭曲的,如果您可以更改模型,您应该。

Precipitation 数据输入到 Level 查询。每个字段和行需要一个子查询:

from django.db.models import Q, OuterRef, Subquery

join_criteria = Q(
    observation_id=OuterRef('observation_id'), 
    observation_datetime = OuterRef('observation_datetime')
)

subquery_precipitation = Subquery(Precipitation.objects
    .filter(join_criteria)
    .values('precipitation')[:1])

subquery_precipitation_type = Subquery(Precipitation.objects
    .filter(join_criteria)
    .values('precipitation_type')[:1])

levels = (Level.objects
        .annotate(precipitation=subquery_precipitation)
        .annotate(precipitation_type=subquery_precipitation_type))

现在尝试将字段数乘以查询中的预期行数,即需要执行的子查询数。

所以这是一个概念证明,你可以在紧要关头用在小表和一些字段上。它不适合于大数据集和许多领域。你真的应该重新考虑你的模式。

有了合适的模型,实现你所需要的应该很容易。

5 年前
回复了 Endre Both 创建的主题 » Django 1.11.20获取每个ISO周和年的行数

问题不是失踪 order_by 但可能恰恰相反:违约 订货人 可能出现在 myModel 通过 ordering 指定默认排序的字段,该字段将另一个字段添加到破坏分组的查询中。相关的Django医生是 here .

你可以通过附加 .order_by() 或者您可以像在回答中那样指定不同的顺序。

这是一个让人一次又一次(包括我自己)的障碍,所以我不喜欢在模型中使用默认排序。

注意:当事情没有按计划运行时,通过检查最后执行的查询来检查生成的SQL通常会有帮助:

django.db.connection.queries[-1]

... 或者通过请求刚刚定义的查询的SQL:

str(my_query.query)

如果您喜欢看到的内容,但不喜欢SQL的格式化方式,请查看 sqlparse .

5 年前
回复了 Endre Both 创建的主题 » 如何将Django查询过滤器放在ON子句而不是WHERE子句中?

看了你最后一句话,你似乎想包括没有人的国家和只有被删除的人的国家。为了得到这个,你只是 exclude 那些有残废人民的国家:

qs = Nations.objects.exclude(people__deleted=False)
4 年前
回复了 Endre Both 创建的主题 » 如何将Django查询过滤器放在ON子句而不是WHERE子句中?

有一个鲜为人知的特性是Django 2.0命名的 FilteredRelation 它允许向关系添加其他筛选器。结果是 ON 加入条款:

nations = (Nations.objects
    .annotate(no_deleted=FilteredRelation(
        'people',
        condition=Q(people__deleted=False)))
    .filter(no_deleted=None)
)

print(str(nations.query))

生成的SQL看起来非常像您所追求的:

SELECT "app_nations"."id",
       "app_nations"....
FROM "app_nations"
LEFT OUTER JOIN "app_people" no_deleted ON 
    ("app_nations"."id" = no_deleted."nations_id"
     AND (no_deleted."deleted" = FALSE))
WHERE no_deleted."id" IS NULL
5 年前
回复了 Endre Both 创建的主题 » django url不匹配

不是最终的解决方案,但是url模式末尾缺少斜杠可能是无意的(因为所有其他url都有斜杠),这可能会产生意外的后果。下面是先不带斜线,再带斜线的图案:

url(r'^casos/en_curso/ver_caso/(?P<caso_id>\d+)$', views.ver_caso, name='ver_caso'),
url(r'^casos/en_curso/ver_caso/(?P<caso_id>\d+)/$', views.ver_caso, name='ver_caso'),

除此之外,问题似乎出在模板中;您调用的是不同的URL( /casos/en_curso/ )比你想的要多。你试过手工输入正确的网址吗。 yoursite.com/casos/en_curso/ver_caso/1234/ ? (在更正模式以在结尾添加斜线之后。)

我的猜测是这样的,显示url配置是好的。