将查询合并到一个结果中(rest_views)

时间:2016-06-06 03:16:44

标签: django postgresql django-rest-framework django-queryset

我需要结合不同的" 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)

1 个答案:

答案 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个值的整个查询集。