выполняя правое соединение с django queryset - PullRequest
0 голосов
/ 14 марта 2019

Мне просто нужно применить правое соединение с набором запросов.

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')

1 Ответ

0 голосов
/ 14 марта 2019

Вы пробовали использовать:

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

...