Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django distinct不与Postgres合作_Python_Django_Postgresql_Django Rest Framework_Django Orm - Fatal编程技术网

Python Django distinct不与Postgres合作

Python Django distinct不与Postgres合作,python,django,postgresql,django-rest-framework,django-orm,Python,Django,Postgresql,Django Rest Framework,Django Orm,我正在配置一个API来获取结果列表。这些物品是服装“产品”,有几个“变体” 我试图使用distinct来确保queryset只返回一个独特产品的列表,而不是由于许多变化而重复多次的相同产品 过去,我在产品的主键id上使用了distinct。但是,下面的代码不起作用 当我尝试使用distinct时,我得到一个500错误。没有它,我就不会出错。我不能在本地测试,因为SQLite不喜欢distinct。我正在使用 class InternalListView(APIView): render

我正在配置一个API来获取结果列表。这些物品是服装“产品”,有几个“变体”

我试图使用distinct来确保queryset只返回一个独特产品的列表,而不是由于许多变化而重复多次的相同产品

过去,我在产品的主键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())

啊,我刚想出来

根据django文件

“不同”和“顺序”必须相同

所以这不起作用:

        .distinct('id')
        .order_by('-rating')
但这将起作用:

        .distinct('id')
        .order_by('id')
这是最有效的:

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

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

尝试获取500错误背后的错误消息,并尽可能发布异常的完整堆栈跟踪。但我的猜测是,错误消息是SELECT DISTINCT ON表达式必须按表达式匹配初始顺序。distinct with field Name是一个扩展,仅当distinct提供的字段也提供给first order_by时才起作用。一般来说,我真的建议安装一个本地Postgres服务器,以便在处理类似问题时进行尝试,这并不难。distinct'id'转换为SELECT distinct on,这是一个。由于distinct消除行,PostgreSQL要求您指定一个已定义的顺序,否则会消除随机行,从而导致潜在的不可重复选择。这是一个限制,但它必须是distinct列的子集,并且不相同。如果是这样,这就是django而不是pgsql。distinct将只输出您要求的列,因此无法对任何其他内容进行排序。@AndrewBacker非常有趣的是,PostgreSQL 9.4.6仅在order_by包含至少一个不在distinct列表中的列时才会发出咯咯声。i、 e.选择a、b、a、b、c上的不同选项。。。由一家工厂订购。选择a、b、a、b、c上的不同选项。。。按a、c排序失败,而在a、b、a、b、c上选择DISTINCT。。。由a、b、c订购。被接受。第一个被接受,在我看来是错误的。您可以在输出中获得所有三列,但在第一种情况下,第一行可能是随机的。@Ycon选项3在语义上与其他两列不同。不同的“id”将删除具有相同id的所有行。不同的“id”、“评级”仅删除具有相同id和评级的重复行。@dhke-interest。。。我并没有手工完成很多psql,但实际上我喜欢这种方式。这是对TSQL的一种攻击。我可以理解为什么3可能有效,但这只是事后的合理化。也许a&b已经订了,所以我们现在可以做c了。。但是如果b不在那里,它就会变得混乱。