首页 > 解决方案 > 为什么在 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__'有两个原因:

我只想在序列化程序上创建一个别名:

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

标签: pythondjangodjango-modelsdjango-rest-framework

解决方案


channel_id明确声明

class TestSerializer(serializers.ModelSerializer):
    channel_id = serializers.IntegerField()

    class Meta:
        model = Test
        fields = ['channel_id', 'foo', ]

如果您希望将返回类型更改channel_id为字符串,则可以使用serializers.CharField而不是serializers.IntegerField


推荐阅读