refactored method to get similar list on entities (see todo: establishment/models.py)

This commit is contained in:
Anatoly 2019-12-23 12:59:39 +03:00
parent f6dac3cbcd
commit 2fb338bc59
3 changed files with 29 additions and 15 deletions

View File

@ -253,8 +253,9 @@ class EstablishmentQuerySet(models.QuerySet):
return Subquery( return Subquery(
self.similar_base(establishment) self.similar_base(establishment)
.filter(**filters) .filter(**filters)
.order_by('distance')[:settings.LIMITING_QUERY_OBJECTS] .order_by('distance')
.values('id') .distinct()
.values_list('id', flat=True)[:settings.LIMITING_QUERY_OBJECTS]
) )
def similar_restaurants(self, restaurant): def similar_restaurants(self, restaurant):
@ -271,7 +272,8 @@ class EstablishmentQuerySet(models.QuerySet):
'establishment_gallery__is_main': True, '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_intermediate_public_mark() \
.annotate_mark_similarity(mark=restaurant.public_mark) \ .annotate_mark_similarity(mark=restaurant.public_mark) \
.order_by('mark_similarity') \ .order_by('mark_similarity') \

View File

@ -44,7 +44,7 @@ class EstablishmentListView(EstablishmentMixinView, generics.ListAPIView):
class EstablishmentSimilarView(EstablishmentListView): class EstablishmentSimilarView(EstablishmentListView):
"""Resource for getting a list of similar establishments.""" """Resource for getting a list of similar establishments."""
serializer_class = serializers.EstablishmentSimilarSerializer serializer_class = serializers.EstablishmentSimilarSerializer
pagination_class = PortionPagination pagination_class = None
def get_base_object(self): def get_base_object(self):
""" """
@ -105,7 +105,7 @@ class RestaurantSimilarListView(EstablishmentSimilarView):
base_establishment = self.get_base_object() base_establishment = self.get_base_object()
if base_establishment: if base_establishment:
return qs.similar_restaurants(base_establishment) return qs.similar_restaurants(base_establishment)[:settings.QUERY_OUTPUT_OBJECTS]
else: else:
return EstablishmentMixinView.get_queryset(self) \ return EstablishmentMixinView.get_queryset(self) \
.none() .none()
@ -120,7 +120,7 @@ class WinerySimilarListView(EstablishmentSimilarView):
base_establishment = self.get_base_object() base_establishment = self.get_base_object()
if base_establishment: if base_establishment:
return qs.similar_wineries(base_establishment) return qs.similar_wineries(base_establishment)[:settings.QUERY_OUTPUT_OBJECTS]
else: else:
return qs.none() return qs.none()
@ -134,7 +134,7 @@ class ArtisanProducerSimilarListView(EstablishmentSimilarView):
base_establishment = self.get_base_object() base_establishment = self.get_base_object()
if base_establishment: if base_establishment:
return qs.similar_artisans_producers(base_establishment) return qs.similar_artisans_producers(base_establishment)[:settings.QUERY_OUTPUT_OBJECTS]
else: else:
return qs.none() return qs.none()

View File

@ -1,12 +1,13 @@
"""Product app views.""" """Product app views."""
from rest_framework import generics, permissions from django.conf import settings
from django.shortcuts import get_object_or_404 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 comment.models import Comment
from product import filters, serializers
from comment.serializers import CommentRUDSerializer from comment.serializers import CommentRUDSerializer
from product import filters, serializers
from product.models import Product
from utils.views import FavoritesCreateDestroyMixinView from utils.views import FavoritesCreateDestroyMixinView
from utils.pagination import PortionPagination
class ProductBaseView(generics.GenericAPIView): class ProductBaseView(generics.GenericAPIView):
@ -35,7 +36,15 @@ class ProductListView(ProductBaseView, generics.ListAPIView):
class ProductSimilarView(ProductListView): class ProductSimilarView(ProductListView):
"""Resource for getting a list of similar product.""" """Resource for getting a list of similar product."""
serializer_class = serializers.ProductBaseSerializer 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): class ProductDetailView(ProductBaseView, generics.RetrieveAPIView):
@ -95,7 +104,10 @@ class SimilarListView(ProductSimilarView):
def get_queryset(self): def get_queryset(self):
"""Overridden get_queryset method.""" """Overridden get_queryset method."""
return super().get_queryset() \ qs = super(SimilarListView, self).get_queryset()
.has_location() \ base_product = self.get_base_object()
.similar(slug=self.kwargs.get('slug'))
if base_product:
return qs.has_location().similar(slug=self.kwargs.get('slug'))[:settings.QUERY_OUTPUT_OBJECTS]
else:
return qs.none()