django从查询集上的一对多反向关系中添加一列

时间:2018-10-14 07:31:05

标签: python django django-queryset annotate

嗨,我有个问题可以说我有这个型号:

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属性一起使用。

2 个答案:

答案 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仅获取所需的对象