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