Найти родительские данные с помощью Django ORM - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть 3 таблицы

  1. AllTests
  2. ReportFormat
  3. Параметр

AllTests имеет reportFormat как ForeignKey с отношением один к одному.

class AllTests(models.Model):
    id=models.AutoField(primary_key=True)
    name=models.CharField(max_length=200)
    reportFormat=models.ForeignKey(ReportFormat)
    .....
    .....
    class Meta:
        db_table = 'AllTests'

Таблица параметров имеет параметр reportFormat как ForeignKey с одним слишком большим количеством отношений.Означает, что один формат отчета имеет много параметров.

class Parameter(models.Model):
        id=models.AutoField(primary_key=True)
        name=models.CharField(max_length=200)
        reportFormat=models.ForeignKey(ReportFormat)
        .....
        .....
        class Meta:
            db_table = 'AllTests

Таблица ReportFormat: -

class ReportFormat(models.Model):
            id=models.AutoField(primary_key=True)
            .....
            .....
            class Meta:
                db_table = 'ReportFormat'

Я хочу сделать запрос к модели параметров, который возвращает данные параметров со связанными данными испытаний.Пожалуйста, предложите мне лучший способ для того же.

Мой текущий запрос похож на этот.

from django.db.models import (
   Sum, Value, Count, OuterRef, Subquery
)

data = Parameter.objects.filter(isDisable=0).values('id', 'name', 'reportFormat_id').annotate(
  test=Subquery(Alltsets.objects.filter(reportFormat_id=OuterRef('reportFormat_id').values('id', 'name')))
)

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Поскольку столбец формата отчета обеих таблиц относится к одному и тому же столбцу таблицы формата отчета, может быть, вы можете напрямую связать их с чем-то вроде ниже.

select * from parameter inner join alltests on parameter.reportformat=alltests.reportformat

Может быть, в ORM что-то вроде этого?

Parameter.objects.filter().annotate(alltests_id=F('reportformat__alltests__id'),alltests_name=F('reportformat__alltests__name'),....other fields)
0 голосов
/ 06 декабря 2018

Получить все Parameter и AllTests объекты.Найдите объект alltests параметра, используя поле reportFormat.Добавьте соответствующие данные к parameter dict.

Solution :

parameter_qs = Parameter.objects.all().select_related('reportFormat')
alltests_qs = AllTests.objects.all().select_related('reportFormat')

data = []
for parameter in parameter_qs:
    item = {
        'id': parameter.id,
        'name': parameter.name,
        'alltests': {}
    }

    # fetch related AllTests object using `reportFormat` field
    alltests_obj = None
    for alltests in alltests_qs:
        if parameter.reportFormat == alltests.reportFormat:
            alltests_obj = alltests
            break

    if alltests_obj is not None:
        item['alltests'] = {
            'id': alltests_obj.id,
            'name': alltests_obj.name
        }

    data.append(item)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...