Python Django distinct不与Postgres合作
我正在配置一个API来获取结果列表。这些物品是服装“产品”,有几个“变体” 我试图使用distinct来确保queryset只返回一个独特产品的列表,而不是由于许多变化而重复多次的相同产品 过去,我在产品的主键id上使用了distinct。但是,下面的代码不起作用 当我尝试使用distinct时,我得到一个500错误。没有它,我就不会出错。我不能在本地测试,因为SQLite不喜欢distinct。我正在使用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
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不在那里,它就会变得混乱。