在Django中过滤时,如何保留商品顺序?

时间:2018-07-26 07:55:50

标签: django django-models django-rest-framework django-views

我已经用 $result = json_decode($temp,true); echo $result['result']['items'][0]['woj']; Recommendations进行了排序,并获得了ID,然后当我对其进行过滤以获取rating_prediction时,排序就不再相同了

Tracks

型号:

class RecommendationView(generics.ListAPIView):
    authentication_classes = (TokenAuthentication,)
    permission_classes = (IsAuthenticated,)
    serializer_class = RecommendedTrackSerializer
    queryset = Recommendations.objects.all()
    pagination_class = api_settings.DEFAULT_PAGINATION_CLASS

    def get_queryset(self):
        recommendation = Recommendations.objects.filter(user=self.request.user)
        sorted_recommendation = recommendation.order_by('-rating_prediction')
        ids = list(sorted_recommendation.values_list('track', flat=True))
        tracks = Track.objects.filter(id__in=ids)
        return tracks

2 个答案:

答案 0 :(得分:1)

您的过滤方式如下:

tracks = Track.objects.filter(id__in=ids)

但这不是 并不意味着Track的顺序与ids相同。您只需进行过滤,然后根据数据库对此进行索引的方式,通常它将按id或其他某种度量标准生成列表顺序(例如,如果您将默认顺序附加到Track模型)。这也可能取决于数据库引擎。由于您从未声明过订单,因此数据库具有“自由度”来选择任何订单。

但是,您可以减少查询量,并编写如下:

def get_queryset(self):
    return Track.objects.filter(
        recommendations__user=self.request.user
    ).order_by('-recommendations__rating_prediction')

如果用户每首曲目只能给出一个推荐,则不会产生任何重复。如果用户可以为某个曲目提供多个建议,则应添加.distinct()调用。

因此,我们获得了给定用户推荐的Track,并根据用户推荐的方式对它们进行排序,所有这些都在一个查询中。

答案 1 :(得分:1)

Track.objects.filter(recommendation__user=self.request.user).order_by('-recommendation__rating_prediction')