[英]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.