实施重击时出错,在什么方面-我不明白
追溯
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'.
模型产品,类别。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
序列化器
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']
意见
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
您从请求中获取一个值
slug,并尝试使用该值过滤外键字段设置的查询,并且在外键中有一个通过 id 的链接。因此,在过滤 Product 模型之前,您需要找到所需 Category 对象的 id,或者不更改任何内容,而是指定过滤器搜索字段slug: