Django search возвращает исключение Exception Value: object of type 'method' has no len()
Довольно новичок в Django Rest Framework и я не совсем уверен, как отладить эту ошибку на данный момент. Когда я устанавливаю точку останова в представлении поиска. Я вижу все мои products
в results
<bound method QuerySet.distinct of <ProductQuerySet [<Product: Product object (4)>, <Product: Product object (8)>, <Product: Product object (9)>, <Product: Product object (10)>]>>
Пагинация установлена в settings.py
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.SessionAuthentication",
"api.authentication.TokenAuthentication",
],
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticatedOrReadOnly", # GET for everyone, all other calls need to be authenticated
],
"DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
"PAGE_SIZE": 10,
}
Поисковый вид
from rest_framework import generics
from products.models import Product
from products.serializers import ProductSerializer
class SearchListView(generics.ListAPIView):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def get_queryset(self, *args, **kwargs):
qs = super().get_queryset(*args, **kwargs)
q = self.request.GET.get("q")
results = Product.objects.none()
if q is not None:
user = None
if self.request.user.is_authenticated:
user = self.request.user
results = qs.search(q, user=user)
return results
Просмотр продукции
from rest_framework import generics, mixins
from django.shortcuts import get_object_or_404
from api.mixins import StaffEditorPermissionMixin, UserQuerySetMixin
from .models import Product
from .serializers import ProductSerializer
class ProductListCreateAPIView(
UserQuerySetMixin, StaffEditorPermissionMixin, generics.ListCreateAPIView
):
queryset = Product.objects.all()
serializer_class = ProductSerializer
def perform_create(self, serializer):
title = serializer.validated_data.get("title")
content = serializer.validated_data.get("content") or None
if content is None:
content = title
serializer.save(user=self.request.user, content=content)
class ProductDetailAPIView(
UserQuerySetMixin, StaffEditorPermissionMixin, generics.RetrieveAPIView
):
queryset = Product.objects.all()
serializer_class = ProductSerializer
Модель продукции
from django.db import models
from django.conf import settings
from django.db.models import Q
User = settings.AUTH_USER_MODEL # auth.User
class ProductQuerySet(models.QuerySet):
def is_public(self):
return self.filter(public=True)
def search(self, query, user=None):
lookup = Q(title__icontains=query) | Q(content__icontains=query)
qs = self.is_public().filter(lookup)
if user is not None:
qs2 = self.filter(user=user).filter(lookup)
qs = (qs | qs2).distinct
return qs
class ProductManager(models.Manager):
def get_queryset(self, *args, **kwargs):
return ProductQuerySet(self.model, using=self._db)
def search(self, query, user=None):
return self.get_queryset().search(query, user=user)
class Product(models.Model):
user = models.ForeignKey(User, default=1, null=True, on_delete=models.SET_NULL)
title = models.CharField(max_length=120)
content = models.TextField(blank=True, null=True)
price = models.DecimalField(max_digits=15, decimal_places=2, default=99.99)
public = models.BooleanField(default=True)
objects = ProductManager()
@property
def sale_price(self):
return "%.2f" % (float(self.price) * 0.8)
# instance method
def get_discount(self):
return "122"
Ниже приведен полный след моей ошибки
Вам не хватает ()
при попытке вызвать метод .distinct()
в search()