嗨,我有个问题可以说我有这个型号:
class Site():
site_name = charfield
class Sample():
site = foregeinkey
state = decimalfield
sample_date = datefield
我需要组装一个这样的表:
| site_name | latest_sample |
| site1 | 150 |
我在文档{Internet上搜索link1 link2时发现了一个注释,当我需要向查询集添加其他一些特征时,我的新查询如下:
class ApiGetListOfSites(View):
def get(self, request, format=None):
objList = Site.objects.annotate(
date_sample=Max('sample__sample_date'),
valor_estado=F('sample__state')
)
json = serializers.serialize('json', objList)
return HttpResponse(json, content_type='application/json')
我遇到的问题是我检索重复的对象,并且在json中没有新的列。一些骗局可以帮助我提出一些有关如何做到这一点的建议。
我想如果我用原始SQL编写查询,则可以与Django模型的raw属性一起使用。
答案 0 :(得分:3)
这是使用Django Subqueries的典型情况:
from django.db.models import OuterRef, Subquery
latest_samples = Sample.objects.filter(site=OuterRef('pk')).order_by('-sample_date')
obj_list = Site.objects.annotate(state=Subquery(latest_samples.values('state')[:1]))
答案 1 :(得分:0)
这样制作表格应该可以:
table=[]
for site in Site.objects.select_related().all():
table.append({'site_name':site.site_name, 'latest_sample': site.sample_set.all().order_by('-pk')[0].state}
@dirkgrotten指出,使用select_related()
pre-populates the cache with the related objects so it's just one query to the db
使用不带参数的select_related
应该预加载所有相关对象,或者您可以使用related_name
仅获取所需的对象