28
Фев
2021

Django RestFramework. Как переопределить метод destroy()?

В интернете много ответов на данный вопрос, но вот у меня не получилось реализовать как мне надо. Есть модель Products:

class Product(models.Model):
    """ Модель товаров """

    name = models.CharField("Название", max_length=50)
    description = models.TextField("Описание", default='')
    price = models.FloatField("Цена", default=0.00)
    favourites = models.ManyToManyField(User, related_name='products')
    created_at = models.DateTimeField("Создано", auto_now_add=True)
    updated_at = models.DateTimeField("Обновлено", auto_now=True)

    def __str__(self):
        return self.name

    def get_review(self):
        return self.review.all()

    class Meta:
        verbose_name = "Товар"
        verbose_name_plural = "Товары"

Есть сериализатор создания списка избранных товаров:

class FavouritesCreateSerializer(serializers.ModelSerializer):
    """ Сериализатор создания списка избранных товаров """

    class Meta:
        model = User
        fields = ("products",)

    def create(self, validated_data):
        validated_data['username'] = self.context['request'].user
        products = validated_data.pop('products')
        user_info = User.objects.get(username=self.context['request'].user)
        for product in products:
            user_info.products.add(product.id)
        return user_info

и сериализатор вывода информации о пользователе:

class UserDetailSerializer(serializers.ModelSerializer):
    """Serializer для информации об избранных продуктах пользователя."""

    favourites = serializers.SerializerMethodField()

    def get_favourites(self, data):
        user_info = User.objects.get(id=self.context['request'].user.id)
        result = user_info.products.all()
        return ProductSerializerForFavourites(result, many=True).data

    order = OrderDetailSerializer(many=True, read_only=True)

    class Meta:
        model = User
        fields = ('username', 'favourites', 'order')

в нём выводится список избранных товаров и заказ пользователя. На странице выводится следующая информация:

{
    "username": "user",
    "favourites": [
        {
            "name": "some_product"
        },
        {
            "name": "some_product"
        }
    ],
    "order": [
        {
            "user": "user",
            "status": "IN_PROGRESS",
            "total": 38200.0,
            "position": [
                {
                    "product": "some_product",
                    "quantity": 1
                },
                {
                    "product": "some_product",
                    "quantity": 4
                }
            ],
            "created_at": "2021-02-28T11:20:57.055137Z",
            "updated_at": "2021-02-28T11:21:52.448573Z"
        }
    ]
}

на этой же странице ниже выводится список товаров для добавления в избранное(сериализатор создания, которого показан выше). В нём можно выбрать сразу несколько товаров и по нажатии POST они появляются с списке favourites. Если выбрать повторно, то список меняется на новый. А как удалить этот список, чтоб по нажатии кнопки delete на странице список favourites становился пустым? Я пытался переопределить метод destroy парой способов, которые нашёл, например с помощью @receiver в моделях, но при нажатии на кнопку delete на странице пользователя просто удаляется пользователь из базы данных со всей информацией о нём. Если нужно что-то ещё добавить к написанному - пишите.

Источник: https://ru.stackoverflow.com/questions/1249845/django-restframework-%D0%9A%D0%B0%D0%BA-%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4-destroy

Тебе может это понравится...

Добавить комментарий