社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Endre Both  »  全部回复
回复总数  5
6 年前
回复了 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))

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

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

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

6 年前
回复了 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 .

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

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

qs = Nations.objects.exclude(people__deleted=False)
6 年前
回复了 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
6 年前
回复了 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配置是好的。