Python 为什么我会得到;AssertionError:不能同时设置“只读”和“必需”;在Django Rest框架中?
为什么我会得到断言错误:当我尝试访问Python 为什么我会得到;AssertionError:不能同时设置“只读”和“必需”;在Django Rest框架中?,python,django,django-models,django-rest-framework,Python,Django,Django Models,Django Rest Framework,为什么我会得到断言错误:当我尝试访问测试视图集时,可能无法同时设置“只读”和“必需” 以下是MRE: models.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) fo
测试视图集时,可能无法同时设置“只读”和“必需”
以下是MRE:
models.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'),
)
views.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'
,视图将神奇地重新开始工作
我不想使用字段=''all'
,原因有二:
- 这将导致我的真实序列化程序中有大量未使用的数据
列最终被呈现为channel\u id
,这很不方便,并将迫使我更新前端代码以引用channel
,否则我将不得不将channel
附加到数据中\u 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
如何将
频道
外键呈现为频道id
?明确声明频道id
class TestSerializer(serializers.ModelSerializer):
channel_id = serializers.IntegerField()
class Meta:
model = Test
fields = ['channel_id', 'foo', ]
类TestSerializer(serializers.ModelSerializer):
channel_id=serializers.IntegerField()
类元:
模型=测试
字段=['channel_id','foo',]
如果希望将通道id的返回类型更改为字符串,则可以使用
序列化程序.CharField
而不是序列化程序.IntegerField
从技术上讲,它应该是IntegerField()
,因为FK不会将其值存储为字符串@Elrond