1

我会尽量保持简洁。我有以下查询:

organisation_survey_results = OrganisationSurveyResult.objects.filter(
    user=user
).order_by('survey', 'created_date')

这也会产生类似的结果:

organisation_survey_results = OrganisationSurveyResult.objects.filter(
    user=user
).order_by(
    'survey__id',
    '-created_date',
).distinct('survey__id',)

在上面,我根据用户匹配进行过滤。一切都很好。我已返回该用户的 5 条记录。

现在,如前所述,每条记录都带有以下内容attributesattribute“(链?)”:

独特slug属性:

organisation_survey_result.organisation_survey.survey.slug

不可变(不变,创建时写入一次)created_date属性:

organisation_survey_result.created_date

对于这五条记录,如果我遍历它们,我有:

django_1    | food
django_1    | 2019-08-12 15:45:49.384071+00:00
django_1    | drink
django_1    | 2019-08-12 15:45:49.390939+00:00
django_1    | politics
django_1    | 2019-08-12 15:45:49.397714+00:00
django_1    | money
django_1    | 2019-08-12 15:45:49.406612+00:00
django_1    | food
django_1    | 2019-08-13 11:26:55.831903+00:00

如您所见,我有两条记录,其中属性organisation_survey.survey.slugwithfood出现两次。对于给定的用户,这很好。 记录可以并且将在其他时间相互取代。


我的问题:

有没有办法可以在查询中过滤掉这些记录?(为了提高性能效率)...我希望能够在QuerySet级别上执行此操作,以减少对数据的压力serialization


版本:

`Django==2.2.1`
`djangorestframework==3.9.3`

数据库引擎:

`PostgreSQL`
4

1 回答 1

0

所以,对我来说,虽然不在一个 QuerySet 中,但输出是一个应该是“可序列化”的 QuerySet:

通过当前用户进行过滤,让我们的 QuerySets 领先一步:

organisation_survey_results = OrganisationSurveyResult.objects.filter(user=user)

获取latest_records每个“organisation_survey”类型的。

latest_records = organisation_survey_results.values(
    'user', 'organisation_survey'
).annotate(
    latest_created_date=Max('created_date')
)

回到最初的 QuerySet,通过从记录中获取的created_date“in”( created_date__in) 进行过滤。latest_recordslatest_created_date

organisation_survey_results = organisation_survey_results.filter(
    created_date__in=latest_records.values('latest_created_date')
).order_by(
    '-created_date'
)

给出了我在上述解决方案中所需要的确切描述。

于 2019-08-13T13:50:24.970 回答