MultiValueDictKeyError в /api/products/
Я столкнулся с MultiValueDictKeyError
в моем проекте Django при попытке получить доступ к API по адресу http://127.0.0.1:8000/api/products/
. Ошибка возникает на этой строке: category = self.request.GET['category']
.
Вот мое мнение:
class ProductList(generics.ListCreateAPIView):
queryset = models.Product.objects.all()
serializer_class = serializers.ProductListSerializer
def get_queryset(self):
qs = super().get_queryset()
category = self.request.GET['category']
category = models.Product.objects.get(category)
qs = qs.filter(category=category)
return qs
Моя Product
модель определяется следующим образом:
class Product(models.Model):
category = models.ForeignKey(ProductCategory, on_delete=models.SET_NULL, null=True, related_name='product_in_category')
retailer = models.ForeignKey(Retailer, on_delete=models.SET_NULL, null=True)
title = models.CharField(max_length=200)
detail = models.CharField(max_length=200, null=True)
price = models.FloatField()
def __str__(self) -> str:
return self.title
Вот мой сериализатор:
class ProductListSerializer(serializers.ModelSerializer):
productreview = serializers.StringRelatedField(many=True, read_only=True)
class Meta:
model = models.Product
fields = ['id', 'category', 'retailer', 'title', 'detail', 'price', 'productreview']
def __init__(self, *args, **kwargs):
super(ProductListSerializer, self).__init__(*args, **kwargs)
Я пытаюсь вызвать список продуктов в соответствии с категорией продукта из моего React frontend, но я продолжаю сталкиваться с MultiValueDictKeyError
. Я пробовал использовать GET.get
и различные другие подходы, но так и не смог решить эту проблему.
Вот трассировка ошибки:
Request Method: GET
Request URL: http://127.0.0.1:8000/api/products/
Django Version: 4.2.13
Exception Type: MultiValueDictKeyError
Exception Value: 'category'
Как исправить эту ошибку и правильно отфильтровать товары по категориям?
Django ищет category
в querystring, а его нет, так что проблема именно в этом. Вам следует обратиться к ней с помощью:
http://127.0.0.1:8000/api/products/?category=14
Но это все равно не сработает: вы должны фильтровать по категории, так что:
class ProductList(generics.ListCreateAPIView):
queryset = models.Product.objects.all()
serializer_class = serializers.ProductListSerializer
def get_queryset(self):
category = self.request.GET['category']
return super().get_queryset().filter(category_id=category)
Таким образом, мы получим Product
с категорией с pk=14
.