python - 新的 read_only + drf 3.8 的默认行为给出错误
问题描述
这是错误的示例:
模型:
from django.db import models
class Hero(models.Model):
alias = models.(max_length=60)
character = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.name
序列化器:
class HeroSerializer(serializers.ModelSerializer):
character = HyperlinkedRelatedField(read_only=True, default=<some user object>)
class Meta:
model = Hero
fields = ('character', 'alias')
视图集:
class HeroViewSet(NestedViewSetMixin,
mixins.CreateModelMixin,
mixins.UpdateModelMixin,
viewsets.ReadOnlyModelViewSet):
queryset = Hero.objects.all()
serializer_class = HeroSerializer
测试:
def test_created_successfully(self):
alias = 'blab blah'
response = self.client.post(self.url, {'name': name})
self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data)
现在这个过去通过的测试是 drf 3.7.7
当我升级到 drf 3.8.2 这个错误开始发生
django.db.utils.IntegrityError: null value in column "character_id" violates not-null constraint
DETAIL: Failing row contains (blah_blah, null).
他们说现在 default + read_only 字段已从可写字段中排除,因此您必须通过编写 perform_create 或覆盖序列化程序的 create 、 update 和 save 函数来显式保存这些字段
所以我在视图集中写了这个
def perform_create(self, serializer):
serializer.save(character=<some user object>)
作为参考,这个 perfrom_create 在 mixins.CreateModelMixin 的 create 方法中被调用
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
所以它在这里工作,但现在如果相同的序列化程序更改为(字符字段更改为名称并且名称的来源为“字符字段”。
class HeroSerializer(serializers.ModelSerializer):
name = HyperlinkedRelatedField(source='character', read_only=True, default=<some user object>)
class Meta:
model = Hero
fields = ('name', 'alias')
我的测试失败了
self.assertEqual(response.status_code, status.HTTP_201_CREATED, response.data)
AssertionError: 400 != 201 : {'character': [ErrorDetail(string='This field is required.',
code='required')]}
并且这个测试在创建函数的下面行失败,即这甚至没有达到我重写的 perform_create。
serializer.is_valid(raise_exception=True)
数据无效。
需要帮忙。
解决方案
推荐阅读
- html - 为什么 display:table 将父元素的高度设置为其最大浮动子元素的高度?
- sqoop - 如何在sqoop中按条件将字符串传递给拆分
- javascript - Web 组件,传入和传出数据
- constraints - 两列的唯一索引,反之亦然
- java - 使用 ProcessBuilder 运行具有交互式 IO 的 C 程序
- javascript - 以动态形式将 javascript 变量传递给附加行
- c# - 为什么 C# 编译器不认为这种泛型类型推断是模棱两可的?
- ajax - Find source of ajax call to example.com/undefined
- sql - SAP HANA | With Clause performance
- node.js - node_modules 从“main”(package.json)中指定的目录中导入?