field 'id' expected a number but got 'slug'
Ошибка в реализации слагирования, в чём - не понимаю
TRACEBACK
Traceback (most recent call last):
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 1772, in get_prep_value
return int(value)
ValueError: invalid literal for int() with base 10: 'bytovaya-tehnika'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/core/handlers/exception.py", line 34, in inner
response = get_response(request)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 115, in _get_response
response = self.process_exception_by_middleware(e, request)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/core/handlers/base.py", line 113, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/views/generic/base.py", line 71, in view
return self.dispatch(request, *args, **kwargs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 505, in dispatch
response = self.handle_exception(exc)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 465, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
raise exc
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/rest_framework/views.py", line 502, in dispatch
response = handler(request, *args, **kwargs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/rest_framework/generics.py", line 199, in get
return self.list(request, *args, **kwargs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/rest_framework/mixins.py", line 38, in list
queryset = self.filter_queryset(self.get_queryset())
File "/home/artyomlazovikov/internet_shop/e_shop/products/views.py", line 37, in get_queryset
queryset = Product.objects.filter(category=category)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/manager.py", line 82, in manager_method
return getattr(self.get_queryset(), name)(*args, **kwargs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/query.py", line 904, in filter
return self._filter_or_exclude(False, *args, **kwargs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/query.py", line 923, in _filter_or_exclude
clone.query.add_q(Q(*args, **kwargs))
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1350, in add_q
clause, _ = self._add_q(q_object, self.used_aliases)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1381, in _add_q
check_filterable=check_filterable,
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1311, in build_filter
condition = self.build_lookup(lookups, col, value)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/sql/query.py", line 1165, in build_lookup
lookup = lookup_class(lhs, rhs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/lookups.py", line 22, in __init__
self.rhs = self.get_prep_lookup()
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/fields/related_lookups.py", line 115, in get_prep_lookup
self.rhs = target_field.get_prep_value(self.rhs)
File "/home/artyomlazovikov/internet_shop/.venv/lib/python3.7/site-packages/django/db/models/fields/__init__.py", line 1776, in get_prep_value
) from e
ValueError: Field 'id' expected a number but got 'bytovaya-tehnika'.
Модели Product, Category. Отношение M2M.
class Category(models.Model):
name = models.CharField(max_length=255)
slug = models.SlugField(max_length=255, db_index=True)
parental_category = models.ManyToManyField('self',
blank=True,
verbose_name='Категория-родитель',
)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=150, db_index=True,
verbose_name='Название')
slug = models.SlugField(max_length=150, db_index=True)
category = models.ForeignKey(Category,
related_name='category',
null=True,
blank=True,
verbose_name='Категория',
on_delete=models.SET_NULL,
)
def __str__(self):
return self.name
Serializers
class ProductSerializer(serializers.ModelSerializer):
category = CategorySerializer(many=True, read_only=True)
class Meta:
model = Product
fields = ['id','name','slug',
'category']
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = ['name', 'parental_category']
views
class ProductList(ListAPIView):
serializer_class = ProductSerializer
def get_queryset(self):
queryset = Product.objects.all()
category = self.kwargs['category_slug']
if category is not None:
queryset = Product.objects.filter(category=category)
return queryset
Ответы (1 шт):
Автор решения: Lothric
→ Ссылка
Вы берёте значение slug из реквеста и пытаетесь фильтровать query set по полю Foreign key с этим значением, а в Foreign key связь через id. Так что либо перед фильтрованием модели Product нужно найти id нужного объекта Category, либо ничего не менять, но указать, чтобы фильтр искал по полю slug:
if category is not None:
# обратите внимание, там двойное подчёркивание
queryset = Product.objects.filter(category__slug=category)