使用django orm查找父数据

bq8i3lrv  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(362)

我有三张table
所有测试
报表格式
参数
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

报表格式table:-

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

d7v8vwbk1#

全部提取 Parameter 以及 AllTests 物体。使用查找参数的alltests对象 reportFormat 现场。将相应的数据添加到 parameter 口述。
解决方案:

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

gudnpqoy2#

因为这两个表的report format列都引用reportformat表的同一列,所以您可以用下面的方式直接将它们关联起来。

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

也许是这样的?

Parameter.objects.filter().annotate(alltests_id=F('reportformat__alltests__id'),alltests_name=F('reportformat__alltests__name'),....other fields)

相关问题