python - DRF Viewset 自定义“创建”方法不调用序列化程序自定义“创建”方法
问题描述
参考下面的代码。我想要实现的是在创建“答案”时创建一个新的“调查”实例。发送的 POST 请求是:{"choice":123}
第一个问题:“调查”:[“此字段为必填项。” ]。从序列化器字段中删除“调查”可以解决这个问题,但我不确定这是正确的。请注意,“Survey”和“Choice”都通过外键与“Answer”建立了一对多的关系。
第二个问题:没有调用序列化程序中的自定义创建方法,因为我输入的测试打印“HELLO”没有执行,也没有创建任何内容。
卡在这个问题上一段时间了,有什么想法吗?非常感谢。
class AddAnswerView(viewsets.ViewSet):
def create(self, request, *args, **kwargs):
data = request.data.get(
"items") if 'items' in request.data else request.data
many = isinstance(data, list)
serializer = AnswerSerializer(data=data, many=many)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class SurveySerializer(serializers.ModelSerializer):
class Meta:
model = models.Survey
fields = ('id',)
def create(self, validated_data):
return models.Survey.objects.create(**validated_data)
class AnswerSerializer(serializers.ModelSerializer):
class Meta:
model = models.Answer
fields = ('choice', 'survey')
def create(self, validated_data):
print('HELLO')
user = self.context['request'].user
new_survey = models.Survey.objects.create(user=user)
answer = models.Answer.objects.create(survey=new_survey,
**validated_data)
return answer
解决方案
你应该使用viewsets.ModelViewSet
而不是viewsets.ViewSet
然后声明serializer_class = AnswerSerializer
使create
方法工作。
This field is required
是来自 Django 模型而不是 djangorestframework 的错误。你必须在方法上做一些技巧create
来传递它。
推荐阅读
- mysql - 从一列城市中,您将运行什么 sql 查询来生成一列城市排列
- vim - 我可以在 VIM 正常模式下重新映射 WORD 或“W”键吗?
- dnf - 为什么 Mathematica 不像 MATLAB 或 Python 那样流行?
- python-3.x - Azure 存储容器中 Blob 的 CreatedBy/LastModifiedBy 信息
- java - CassandraOperations 更新记录错误:在 SET 部分中找到 PRIMARY KEY 部分 id
- arrays - 使用两个数组进行输出
- image - 压缩图像使其小于 4KB
- windows - 将元数据从一个文件批量复制到另一个文件 (EXIFTOOL)
- java - 我应该如何使用 Hibernate(JPA) 和 Gradle 构建我的 Java 代码?
- javascript - windows.onunload 在 Chrome 上不起作用