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(
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') \

View File

@ -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()

View File

@ -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()