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.

Вернуться на верх