我需要结合不同的" order_by"价值,以及不同的"不同的"值。
我认为这是Postgres的限制。所以我试图通过两个不同的查询来做到这一点。
在英语中 - 我希望它能像这样工作:
1(qset1) - 获取PK的列表(其中数量很大(500),因为许多都是重复的)
2(qset2) - 确保所有PK都是唯一的(删除重复项) - 10个项目的最终列表
3(qset3) - 返回10个项目的扩展查找结果
如果这个方法速度慢/效率低,请打开另一个方法。
供参考 - 我的模型是here。
class ProductListView(APIView):
renderer_classes = (JSONRenderer, )
def get(self, request, *args, **kwargs):
print request
user = User.objects.get(id=3)
qset1 = (
Product.objects
.filter(variation__size__stock__stock__in=[1,2], store__appactive=True, store__region=user.settings_region, **filters)
.filter(Q(gender=user.settings_gender) | Q(gender=3))
.exclude(variation__analytic__user=user)
.order_by('rating', '?')
.value('pk',)
)[:500]
qset2 = (
.distinct('pk')
)[:10]
)
qset3 = (
# READ PK's from QSET2
.values('name', 'color', 'gender')
.annotate(
price=F('variation__price__price'),
)[:10]
)
print str(qset.query)
return Response(qset3)
答案 0 :(得分:0)
Variations Model和你提供的图片有几条丢失的线索,但为了得到你想要的,我想你可以应用以下内容:
class ProductListView(APIView):
renderer_classes = (JSONRenderer, )
def get(self, request, *args, **kwargs):
print request
user = User.objects.get(id=3)
qset1 = Product.objects.filter(variation__size__stock__stock__in=[1, 2],
store__appactive=True, store__region=user.settings_region,
**filters)
.filter(Q(gender=user.settings_gender) | Q(gender=3))
.exclude(variation__analytic__user=user)
.order_by('rating', '?')
.annotate(price=F('variation__price__price'))
.distinct("pk")
print str(qset1.query)
return Response(qset1)
现在,如果您看到, distinct("pk")
将仅对pk值应用distinct。后面的distinct
将应用于将要检索的500个值的整个查询集。