代码之家  ›  专栏  ›  技术社区  ›  GAJESH PANIGRAHI

使用Django ORM查找父数据

  •  0
  • GAJESH PANIGRAHI  · 技术社区  · 6 年前

    我有3张桌子。

    1. 全胜
    2. 报告格式
    3. 参数

    所有测试都将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
    

    报告格式表:

    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 回复  |  直到 6 年前
        1
  •  1
  •   Vishal Raghavan    6 年前

    因为这两个表的report format列引用的是report format表的同一列,所以您可以直接将它们与下面的内容联系起来。

    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)
    
        2
  •  0
  •   Sachin    6 年前

    取全部 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)