我正在配置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())
答案 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有什么问题吗?