首页 > 解决方案 > Django Rest Framework模型视图集 - 在创建之前更新字段

问题描述

我有一个模型视图集:

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"]

这些是 POST 到视图集的字段,但它们不足以完全填充对象,因此我需要添加更多字段。

我尝试过覆盖序列化程序,如下所示:

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

然而,这永远不会被调用(通过在 create 函数中粘贴 print 语句进行测试 - 它永远不会运行)。显然这是因为这个问题:Django Rest Framework 序列化程序 create() 没有被触发这解释了这个问题,但不是如何解决我的问题。

我不确定是否需要重写序列化程序的 is_valid 函数、序列化程序的 create 函数或视图集的 create 函数,或者其他什么。

标签: djangodjango-rest-frameworkdjango-rest-viewsets

解决方案


您应该perform_create()像这样覆盖 on viewset 并传入您的额外数据以创建对象:

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

参考:保存和删除钩子: https ://www.django-rest-framework.org/api-guide/generic-views/#genericapiview (perform_create在此页面中搜索以更快地查找)


推荐阅读