【发布时间】: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_dataINNER JOINvis_visit_parameter_valuesON (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_values 和vis_visit_data 表进行右连接而不是内连接。下面是我要进行更改的 sql 快照。
INNER JOIN
vis_visit_parameter_valuesON (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