From 2fb338bc59af5b2ce5eef297b3106e900e3261f2 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Mon, 23 Dec 2019 12:59:39 +0300 Subject: [PATCH] refactored method to get similar list on entities (see todo: establishment/models.py) --- apps/establishment/models.py | 8 +++++--- apps/establishment/views/web.py | 8 ++++---- apps/product/views/common.py | 28 ++++++++++++++++++++-------- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/apps/establishment/models.py b/apps/establishment/models.py index e5514bb8..8ad1663c 100644 --- a/apps/establishment/models.py +++ b/apps/establishment/models.py @@ -253,8 +253,9 @@ class EstablishmentQuerySet(models.QuerySet): return Subquery( self.similar_base(establishment) .filter(**filters) - .order_by('distance')[:settings.LIMITING_QUERY_OBJECTS] - .values('id') + .order_by('distance') + .distinct() + .values_list('id', flat=True)[:settings.LIMITING_QUERY_OBJECTS] ) def similar_restaurants(self, restaurant): @@ -271,7 +272,8 @@ class EstablishmentQuerySet(models.QuerySet): 'establishment_gallery__is_main': True, } ) - return self.filter(id__in=ids_by_subquery) \ + # todo: fix this - replace ids_by_subquery.queryset on ids_by_subquery + return self.filter(id__in=ids_by_subquery.queryset) \ .annotate_intermediate_public_mark() \ .annotate_mark_similarity(mark=restaurant.public_mark) \ .order_by('mark_similarity') \ diff --git a/apps/establishment/views/web.py b/apps/establishment/views/web.py index d94be1d5..b4e6f776 100644 --- a/apps/establishment/views/web.py +++ b/apps/establishment/views/web.py @@ -44,7 +44,7 @@ class EstablishmentListView(EstablishmentMixinView, generics.ListAPIView): class EstablishmentSimilarView(EstablishmentListView): """Resource for getting a list of similar establishments.""" serializer_class = serializers.EstablishmentSimilarSerializer - pagination_class = PortionPagination + pagination_class = None def get_base_object(self): """ @@ -105,7 +105,7 @@ class RestaurantSimilarListView(EstablishmentSimilarView): base_establishment = self.get_base_object() if base_establishment: - return qs.similar_restaurants(base_establishment) + return qs.similar_restaurants(base_establishment)[:settings.QUERY_OUTPUT_OBJECTS] else: return EstablishmentMixinView.get_queryset(self) \ .none() @@ -120,7 +120,7 @@ class WinerySimilarListView(EstablishmentSimilarView): base_establishment = self.get_base_object() if base_establishment: - return qs.similar_wineries(base_establishment) + return qs.similar_wineries(base_establishment)[:settings.QUERY_OUTPUT_OBJECTS] else: return qs.none() @@ -134,7 +134,7 @@ class ArtisanProducerSimilarListView(EstablishmentSimilarView): base_establishment = self.get_base_object() if base_establishment: - return qs.similar_artisans_producers(base_establishment) + return qs.similar_artisans_producers(base_establishment)[:settings.QUERY_OUTPUT_OBJECTS] else: return qs.none() diff --git a/apps/product/views/common.py b/apps/product/views/common.py index dbb24e53..5eeaccf2 100644 --- a/apps/product/views/common.py +++ b/apps/product/views/common.py @@ -1,12 +1,13 @@ """Product app views.""" -from rest_framework import generics, permissions +from django.conf import settings from django.shortcuts import get_object_or_404 -from product.models import Product +from rest_framework import generics, permissions + from comment.models import Comment -from product import filters, serializers from comment.serializers import CommentRUDSerializer +from product import filters, serializers +from product.models import Product from utils.views import FavoritesCreateDestroyMixinView -from utils.pagination import PortionPagination class ProductBaseView(generics.GenericAPIView): @@ -35,7 +36,15 @@ class ProductListView(ProductBaseView, generics.ListAPIView): class ProductSimilarView(ProductListView): """Resource for getting a list of similar product.""" serializer_class = serializers.ProductBaseSerializer - pagination_class = PortionPagination + pagination_class = None + + def get_base_object(self): + """ + Return base product instance for a getting list of similar products. + """ + product = get_object_or_404(Product.objects.all(), + slug=self.kwargs.get('slug')) + return product class ProductDetailView(ProductBaseView, generics.RetrieveAPIView): @@ -95,7 +104,10 @@ class SimilarListView(ProductSimilarView): def get_queryset(self): """Overridden get_queryset method.""" - return super().get_queryset() \ - .has_location() \ - .similar(slug=self.kwargs.get('slug')) + qs = super(SimilarListView, self).get_queryset() + base_product = self.get_base_object() + if base_product: + return qs.has_location().similar(slug=self.kwargs.get('slug'))[:settings.QUERY_OUTPUT_OBJECTS] + else: + return qs.none()