django - 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 函数,或者其他什么。
解决方案
您应该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
在此页面中搜索以更快地查找)
推荐阅读
- r - 找到从一个顶点到同一个顶点的路径
- verilog - 如何编辑和测试 Verilog 网表
- function - 用numpy sum替换与两个变量的函数内部参数相关的for循环
- laravel - Laravel - 如何编写验证外键数组中唯一字段的组合
- javascript - 无法从使用 spring RedisTemplate 存储的 javascript 中获取 redis 嵌套哈希键值
- extjs6-classic - 滚动面板时日期选择器无法正确打开
- ruby-on-rails - 以简单形式迭代对象时处理输入
- angular - 无法创建自定义角度元素
- android - 在 firebase 实时数据库中添加“.indexOn”规则的正确方法是什么?
- c# - 如何在 ASP .NET Core Razor 页面中读取连接字符串