Возврат списка по запросу POST - PullRequest
0 голосов
/ 30 октября 2018

Я новичок в django и python, я хочу вернуть все объекты, имеющие внешний ключ, предоставленный почтовым запросом.

это моя модель:

class Product(models.Model):
    name = models.CharField(max_length=200)
    image = models.CharField(max_length=400)
    price = models.CharField(max_length=200)
    isFavorite = models.BooleanField(default=False)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

это мой сериализатор:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = ('id', 'name', 'image', 'price', 'isFavorite')

это мой код в views.py:

class ListProductsOfCategory(generics.ListAPIView):
    serializer_class = ProductSerializer()

    def post(self, request, *args, **kwargs):
        # catch the category id of the products.
        category_id = request.data.get("category_id", "")
        # check if category id not null
        if not category_id:
            """

            Do action here 

            """
        # check if category with this id exists     
        if not Category.objects.filter(id=category_id).exists():
            """

            Do action here 

            """

        selected_category = Category.objects.get(id=category_id)
        # get products of this provided category.
        products = Product.objects.filter(category=selected_category)
        serialized_products = []
        # serialize to json all product fetched 
        for product in products:
            serializer = ProductSerializer(data={
                "id": product.id,
                "name": product.name,
                "image": product.image,
                "price": product.price,
                "isFavorite": product.isFavorite
            })
            if serializer.is_valid(raise_exception=True):
                serialized_products.append(serializer.data)
            else:
                return
        return Response(
            data=serialized_products
            ,
            status=status.HTTP_200_OK
        )

этот код частично сработал, он возвращает ответ ниже.

enter image description here

проблема в том, что первичный ключ "id" продукта отсутствует, я хочу, чтобы ответ был таким:

enter image description here

P.S. Если кто-то может улучшить код и сделать его менее сложным, я был бы благодарен.

Заранее спасибо

1 Ответ

0 голосов
/ 30 октября 2018

Вы используете сериализаторы неправильно. Вы должны передать экземпляр, и он даст вам сериализованные данные; Передача данных и проверка is_valid предназначены для отправки данных, а не для их отправки. Кроме того, вы можете передать весь набор запросов с помощью many=True:

serialized_products = ProductSerializer(products, many=True)

так что вам не нужен цикл for.

Но на самом деле DRF сделает все это за вас, потому что вы используете ListAPIView. Все, что вам нужно сделать, это сообщить ему, какой набор запросов вы хотите, что вы делаете в методе get_queryset. Так что все, что вам нужно, это:

class ListProductsOfCategory(generics.ListAPIView):
    serializer_class = ProductSerializer()

    def get_queryset(self):
        return Product.objects.filter(category__id=self.request.data['category_id'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...