Модель просмотра Django Rest Framework - обновление полей перед созданием - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть модель просмотра:

class ExpenseViewSet(ModelViewSet):
    permission_classes = [permissions.IsAuthenticated, HasMetis]
    serializer_class = ExpenseSerializer

    def get_queryset(self):
        return Expense.objects.filter(recorded_by=self.request.user)

И сериализатор:

class ExpenseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Expense
        fields = ["flat_id", "flat_group_id", "description", "notes", "amount"]

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

Я попытался переопределить сериализатор, например, так:

class ExpenseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Expense
        fields = ["flat_id", "flat_group_id", "description", "notes", "amount"]

    def create(self, validated_data):
        expense = Expense.objects.create(
            flat_id=validated_data["operations_flat"],
            flat_group_id=validated_data["operations_building"],
            description=validated_data["description"],
            notes=validated_data["notes"],
            amount=validated_data["amount"],
            recorded_by=self.request.user,
        )
        return expense

Это, однако, никогда не вызывается (проверяется путем наклеивания печатиоператор в функции создания - он никогда не выполняется).Видимо, это из-за этого вопроса: Сериализатор Django Rest Framework create () не запускается Это объясняет проблему, но не то, как решить мою проблему.

Я не увереннужно ли мне переопределить функцию is_valid сериализатора, функцию создания сериализатора или функцию создания набора данных, или что-то еще.

1 Ответ

0 голосов
/ 18 декабря 2018

Вы должны переопределить perform_create() в наборе представлений примерно так и передать свои дополнительные данные для создания объекта:

def perform_create(self, serializer):
    serializer.save(user=self.request.user)

Ссылка: Хуки для сохранения и удаления: https://www.django -rest-framework.org / api-guide / generic-views / # genericapiview (ищите perform_create на этой странице для более быстрого поиска)

...