0

Мне нужно совместить другое значение «order_by» и другое «отличное» значение.Объединение запросов в один результат (rest_views)

Я считаю, что это ограничение 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

qset2: убедитесь, что все первичные ключи уникальны? Первичные ключи всегда уникальны по определению. – e4c5

+0

Postgresql имеет очень мало ограничений, вы делаете запрос orj django or even, тогда часто можно использовать всю мощь postgresql. – e4c5

+0

. Пожалуйста, разместите свои модели в строке и объясните, что вы действительно хотите отобразить , – e4c5

ответ

0

Есть несколько отсутствующих ключей вариаций модели и картины, которую вы предоставили, но, чтобы получить то, что вы хотите, я думаю, вы можете применить следующие:

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 будет применяться к общему количеству запросов, скажем 500 значений, которые будут получены.

 Смежные вопросы

  • Нет связанных вопросов^_^