Django明显与Postgres不同

时间:2016-04-18 07:06:30

标签: python django postgresql django-rest-framework django-orm

我正在配置API来提取结果列表。这些物品是服装“产品”,有几种“变化”。

我正在尝试使用 distinct 来确保查询集只返回一个独特产品列表 - 而不是由于许多变化而重复多次相同的产品。

过去,我在产品的主键(id)上使用了distinct。但是,以下代码无效。

当我尝试使用“distinct”时出现500错误。没有它 - 我没有错误。我不能在本地测试,因为SQLite不喜欢distinct。我正在使用

class InternalListView(APIView):

    renderer_classes = (JSONRenderer, )

    def get(self, request, *args, **kwargs):

        filters = {}
        for key, value in request.GET.items():
            key = key.lower()
            if key in countmatch:
                lookup, val = internalmatch[key](value.lower())
                filters[lookup] = val

        qset = (
            Product.objects
            .filter(**filters)
            .distinct('id')
            .order_by('-rating')
            .values('name', 'brand', 'rating')
            .annotate(
                price=F('variation__price__price'),
                id=F('pk'),
                vari=F('variation'),
            )
        )

        for i in qset:
            i['likes'] = random.randint(500, 1000)

        print qset

        return Response(qset.all())

1 个答案:

答案 0 :(得分:3)

啊,我只是想通了。

根据django docs(https://docs.djangoproject.com/en/1.9/ref/models/querysets/#distinct

两者截然不同order_by必须是相同的。

所以这不起作用:

        .distinct('id')
        .order_by('-rating')

但这会奏效:

        .distinct('id')
        .order_by('id')

这最有效:

        .distinct('rating', 'id')
        .order_by('-rating')

使用选项3有什么问题吗?