繁体   English   中英

在 Django 中加入 2 个表

[英]Join 2 tables in django

Select (..)
FROM ActualTotalLoad 
INNER JOIN ResolutionCode
ON ActualTotalLoad.resolutioncodeid = ResolutionCode.id

我有一个 uri:/areaname/ resolutioncodetext /date

并且我想进行上述查询,因此我可以获得从此 uri 提供的分辨率代码文本。

我试过Actualtotalload.objects.select_related()但它排除了一些 columns 。

要求任何您可能需要的额外东西

模型.py

class Areatypecode(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)  # Field name made lowercase.
    entitycreatedat = models.DateTimeField(db_column='EntityCreatedAt')  # Field name made lowercase.
    entitymodifiedat = models.DateTimeField(db_column='EntityModifiedAt')  # Field name made lowercase.
    areatypecodetext = models.CharField(db_column='AreaTypeCodeText', max_length=255)  # Field name made lowercase.
    areatypecodenote = models.CharField(db_column='AreaTypeCodeNote', max_length=255)  # Field name made lowercase.

class Actualtotalload(models.Model):
    source = "entso-e"
    dataset ="ActualTotalLoad"
    actualtotalload_id = models.BigAutoField(db_column='Id', primary_key=True)  # Field name made lowercase.
    entitycreatedat = models.DateTimeField(db_column='EntityCreatedAt')  # Field name made lowercase.
    entitymodifiedat = models.DateTimeField(db_column='EntityModifiedAt')  # Field name made lowercase.
    actiontaskid = models.BigIntegerField(db_column='ActionTaskID')  # Field name made lowercase.
    status = models.CharField(db_column='Status', max_length=2, blank=True, null=True)  # Field name made lowercase.
    year = models.IntegerField(db_column='Year')  # Field name made lowercase.
    month = models.IntegerField(db_column='Month')  # Field name made lowercase.
    day = models.IntegerField(db_column='Day')  # Field name made lowercase.
    datetime = models.DateTimeField(db_column='DateTime')  # Field name made lowercase.
    areaname = models.CharField(db_column='AreaName', max_length=200, blank=True, null=True)  # Field name made lowercase.
    updatetime = models.DateTimeField(db_column='UpdateTime')  # Field name made lowercase.
    totalloadvalue = models.DecimalField(db_column='TotalLoadValue', max_digits=24, decimal_places=2)  # Field name made lowercase.
    areatypecodeid = models.ForeignKey(Allocatedeicdetail,db_column='AreaTypeCodeId', on_delete = models.CASCADE, blank=True, null=True)  # Field name made lowercase.
    mapcodeid = models.ForeignKey(Mapcode,on_delete = models.CASCADE, db_column='MapCodeId', blank=True, null=True)  # Field name made lowercase.
    areacodeid = models.ForeignKey(Areatypecode,related_name='areatypecode',on_delete = models.CASCADE, db_column='AreaCodeId')  # Field name made lowercase.
    resolutioncodeid = models.ForeignKey(Resolutioncode,on_delete = models.CASCADE,db_column='ResolutionCodeId', blank=True, null=True)  # Field name made lowercase.
    rowhash = models.CharField(db_column='RowHash', max_length=255, blank=True, null=True)  # Field name made lowercase.

class Resolutioncode(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)  # Field name made lowercase.
    entitycreatedat = models.DateTimeField(db_column='EntityCreatedAt')  # Field name made lowercase.
    entitymodifiedat = models.DateTimeField(db_column='EntityModifiedAt')  # Field name made lowercase.
    resolutioncodetext = models.CharField(db_column='ResolutionCodeText', unique=True, max_length=255)  # Field name made lowercase.
    resolutioncodenote = models.CharField(db_column='ResolutionCodeNote', max_length=255, blank=True, null=True)  # Field name made lowercase.


我从 api 返回的错误:

异常值:无法将关键字“数据集”解析为字段。 选项有:actiontaskid、actualtotalload_id、areacodeid、areacodeid_id、areaname、areatypecodeid、areatypecodeid_id、datetime、day、entitycreatedat、entitymodifiedat、mapcodeid、mapcodeid_id、month、resolutioncodeid、resolutioncodeid_id、rowhash、status、totalloadvalue、updatetime、year

from django.http import JsonResponse, HttpResponse
from .models import *
from RestApi.serializers import *
# Create your views here.

def ATL_for_date(request , AreaName = None , ResolutionCode = None  , Date = None  ):
    Year = int ( Date [:4])
    Month = int ( Date [5:7])
    Day = int ( Date [8:])
    AreaName = str(AreaName)
    ResolutionCode = str(ResolutionCode)
    Actualtotalload.objects.select_related()
    queryset = list(Actualtotalload.objects.filter( areaname=AreaName ,  resolutioncodeid__resolutioncodetext= ResolutionCode, year = Year , month = Month , day = Day).values('source','dataset','areaname','areatype','mapcode','resolutioncodetext','year','month','day','datetime','totalloadvalue','updatetime'))
    queryset.annotate(dataset=Value('ActualTotalLoad', output_field=CharField()))
    queryset.annotate(source=Value('entso-e', output_field=CharField()))
    return  JsonResponse(queryset, safe = False)

先感谢您

您需要将所需关系的名称作为参数:

Actualtotalload.objects.select_related("resolutioncodeid")

还有一件事 - ForeignKeys 上的id后缀不准确,因为它指的是模型,而不是 id(Django 处理 id,创建一个带有_id后缀的新属性。

编辑

如果您按resolutioncodeid__resolutioncodetext过滤,则不需要select_related('resolutioncodeid')

def ATL_for_date(request, AreaName=None, ResolutionCode=None, Date=None):
    Year = int(Date[:4])
    Month = int(Date[5:7])
    Day = int(Date[8:])
    AreaName = str(AreaName)
    ResolutionCode = str(ResolutionCode)
    queryset = list(
        Actualtotalload.objects.filter(
            areaname=AreaName,
            resolutioncodeid__resolutioncodetext=ResolutionCode,
            year=Year,
            month=Month,
            day=Day,
        )
        .select_related("areatypecodeid", "mapcodeid")
        .values(
            "areaname",
            "areatypecodeid__areatypecodetext",
            "mapcodeid__mapcodetext",
            "resolutioncodeid__resolutioncodetext",
            "year",
            "month",
            "day",
            "datetime",
            "totalloadvalue",
            "updatetime",
        )
    )

    return JsonResponse(queryset, safe=False)

一些错误的事情:

1)(数据集,源)不是模型字段,您不能在查询集值中使用它,您应该遍历查询集并附加这些,或者您可以将它们注释到查询集,例如:

.annotate(dataset=Value('ActualTotalLoad', output_field=CharField()))

2)以下行没有任何作用,因为您已经在值中选择了下表,而且您甚至没有正确链接它

Actualtotalload.objects.select_related("resolutioncodetext")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM