Мне просто нужно применить правое соединение с набором запросов.
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'))
код выше генерирует следующий оператор объединения .
ОТ vis_visit_data
ВНУТРЕННЕЕ СОЕДИНЕНИЕ vis_visit_parameter_values
ВКЛ
(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_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')