python - 为什么在 Django Rest Framework 中出现“AssertionError:可能无法同时设置 `read_only` 和 `required`”?
问题描述
为什么我AssertionError: May not set both 'read_only' and 'required'
在尝试访问时得到TestViewSet
?
这是MRE:
模型.py:
class Channel(models.Model):
id = models.CharField(max_length=12, primary_key=True)
class Test(models.Model):
channel = models.ForeignKey(Channel, on_delete=models.PROTECT)
foo = models.IntegerField(default=1)
class Meta:
unique_together = (
('channel_id', 'foo'),
)
视图.py:
from rest_framework import routers, viewsets, serializers
class TestSerializer(serializers.ModelSerializer):
class Meta:
model = Test
fields = [
'channel_id',
'foo',
]
class TestViewSet(viewsets.ModelViewSet):
queryset = Test.objects.all()
serializer_class = TestSerializer
router = routers.DefaultRouter()
router.register('test', TestViewSet)
如果您删除序列化程序上的唯一约束Test
或设置fields='__all__'
,视图会神奇地再次开始工作。
我不想使用fields='__all__'
有两个原因:
- 这将导致我真正的序列化器上有很多未使用的数据
- 该
channel_id
列最终呈现为channel
,这很不方便,并且将迫使我将前端代码更新为 referencechannel
,否则我将不得不附加_id
到数据中。
我只想在序列化程序上创建一个别名:
class TestSerializer(serializers.ModelSerializer):
channel_id = serializers.CharField(source='channel_id')
...
但这样做会导致另一个错误......
AssertionError: It is redundant to specify `source='channel_id'` on field 'CharField' in serializer
'OrderSerializer', because it is the same as the field name. Remove the `source` keyword argument.
TLDR;
如何将channel
外键呈现为channel_id
?
解决方案
channel_id
明确声明
class TestSerializer(serializers.ModelSerializer):
channel_id = serializers.IntegerField()
class Meta:
model = Test
fields = ['channel_id', 'foo', ]
如果您希望将返回类型更改channel_id
为字符串,则可以使用serializers.CharField
而不是serializers.IntegerField
推荐阅读
- eclipse - 如何在 selenium 中具有相同功能的 2 个不同 URL 中运行相同的测试用例
- java - 我想获取字符串中的最后一个字母并根据字母打印真或假
- c# - 如何通过反射设置结构字段的值?
- java - 原因:java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0)
- meteor - Iron-router中的中间件
- lua - 为什么 Lua 的 arg 表不是单索引的?
- jquery - 使用 jQuery 上传和裁剪图像
- python - Python ,面临与 int() 的一些混淆
- vb.net - 我需要帮助来更新列表视图中的多个记录,以便使用 vbnet 一键访问
- c - 多重递归