【问题标题】:perfoming right join with django queryset使用 django 查询集执行右连接
【发布时间】:2019-08-05 03:28:31
【问题描述】:

我只需要对查询集应用右连接。

vdata = (VisVisitData.objects.
         .select_related('vpvalue','vparameter')
         .filter(vpvalue__vparameter=9,)
         .values(name=F('vpvalue__parameter_value'),
                 visit_day=F('visit__visit_day'),
                 question=F('vparameter'),
                 value_id=F('vpvalue'))
        .annotate(data=Count('vpvalue_id'))
        .order_by('visit__visit_day'))

以上代码生成以下join语句。

FROM vis_visit_data INNER JOIN vis_visit_parameter_values ON (vis_visit_data.vpvalue_id = vis_visit_parameter_values.vpvalue_id) 左外连接 vis_visits 开 (vis_visit_data.visit_id = vis_visits.visit_id)

但我需要使用vis_visit_parameter_valuesvis_visit_data 表进行右连接而不是内连接。下面是我要进行更改的 sql 快照。

INNER JOIN vis_visit_parameter_values ON (vis_visit_data.vpvalue_id = vis_visit_parameter_values.vpvalue_id)

模型类(在查询集中使用这 3 个模型

class VisVisitParameterValues(models.Model):
    vpvalue_id = models.IntegerField(primary_key=True)
    vparameter = models.ForeignKey('VisVisitParameters', models.DO_NOTHING,related_name='values')
    parameter_value = models.TextField(blank=True, null=True)

class VisVisits(models.Model):
    visit_id = models.IntegerField(primary_key=True,auto_created=True)
    app_local_id = models.IntegerField(blank=True, null=True)
    visit_day = models.IntegerField(blank=True, null=True,db_column='visit_no')

class VisVisitData(models.Model):
    vdata_id = models.IntegerField(primary_key=True,auto_created=True)
    app_local_id = models.IntegerField(blank=True, null=True)
    visit = models.ForeignKey('VisVisits', models.DO_NOTHING, blank=True, null=True, related_name='data')
    vparameter = models.ForeignKey('VisVisitParameters', models.DO_NOTHING, blank=True, null=True,related_name='parameters')
    vpvalue = models.ForeignKey('VisVisitParameterValues', models.DO_NOTHING, blank=True, null=True,related_name='parameters_values')

【问题讨论】:

  • 不是一个正确的答案,但在最坏的情况下,您始终可以进行原始 SQL 查询 (docs.djangoproject.com/en/2.1/topics/db/sql)
  • @webbyfox 请重新阅读我的评论 - 如果有办法使用 ORM 功能获得相同的结果,我不建议使用原始 SQL,我只是提到 at 最糟糕的_ (=> "如果没有其他方法") 至少 这个选项 - 它实际上存在的原因是 Django ORM 没有被设计为一个完整的 SQL 重新实现,而是使最常见的 80% 东西都很简单。
  • @webbyfox 也添加了模型类。我已经浏览了你分享的链接。这并不能解决我的问题。
  • VisVisitParameters 模型丢失。你的最终目标也不清楚。你想用什么数据做什么?右连接不能在 Django 中工作,其中连接是通过将字段(=右侧)添加到对象(=左侧)来实现的。如果左侧为无,则您无处附加右侧对象。但是右连接被镜像左连接,你只需要左右交换你的查询。具体如何做到这一点取决于您需要哪些字段以及将它们用于什么。

标签: django python-3.x django-queryset right-join


【解决方案1】:

您是否尝试过使用:

.filter(Q(vpvalue__isnull=True) | Q(vpvalue__vparameter=9))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 2014-04-25
    • 2018-11-18
    • 2013-06-26
    • 2020-07-17
    • 2016-01-22
    相关资源
    最近更新 更多