【问题标题】:Django Rest Framework modelviewset - updating fields before createDjango Rest Framework模型视图集 - 在创建之前更新字段
【发布时间】:2019-05-18 07:15:33
【问题描述】:

我有一个模型视图集:

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 serializer create() doesn't get triggered 这解释了问题,但不是如何解决我的问题。

我不确定是否需要重写序列化器的is_valid函数,序列化器的create函数,或者viewset的create函数,或者别的什么。

【问题讨论】:

  • 可能是您覆盖了视图集上的某些内容,导致默认视图行为混乱,或者您提供的数据无效(检查服务器响应代码和内容)。

标签: django django-rest-framework django-rest-viewsets


【解决方案1】:

您应该像这样覆盖视图集上的 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 以加快查找速度)

【讨论】:

    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 2018-07-07
    • 2015-09-19
    • 1970-01-01
    • 2014-05-10
    • 2014-04-03
    • 1970-01-01
    • 2020-11-11
    相关资源
    最近更新 更多