<PYTHON DRF>为什么我仅从request.data中获得一个值而不是列表?

时间:2020-10-25 17:09:32

标签: python django django-rest-framework

我从request.data访问所有值没什么问题。

这是我的代码和屏幕:

我的观点集:

class LorebookViewset(ModelViewSet):
    queryset = Lorebook.objects.all()
    serializer_class = LorebookSerializer
    permission_classes = (
        permissions.IsAuthenticated,
    )

    def perform_create(self, serializer):
        data = self.request.data
        print(data)
        print(data['teams'])

序列化器:

class LorebookSerializer(serializers.ModelSerializer):
    teams = serializers.StringRelatedField(many=True, read_only=True)
    categories = serializers.StringRelatedField(many=True, read_only=True)
    author = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = Lorebook
        fields = '__all__'

型号:

class Lorebook(models.Model):
    title = models.CharField(max_length=50, unique=True)
    cover = models.FileField(default='lorebooks/cover.jpg', null=True)
    thumbnail = models.FileField(default='lorebooks/thumb.jpg', null=True)
    banner = models.FileField(default='lorebooks/banner.jpg', null=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    tags = ArrayField(models.TextField(), default=list)
    categories = models.ManyToManyField(Category)
    teams = models.ManyToManyField(Team)
    date_created = models.DateTimeField(auto_now_add=True)
    trailer = models.TextField()
    is_read = models.BooleanField(default=False)

    def __str__(self):
        return self.title

邮递员中的数据: Postman data

在viewset中的perform_create中打印: data on server

为什么我只从团队而不是列表中获得最后的价值?

1 个答案:

答案 0 :(得分:1)

这实际上是按照QueryDict的规范应该获得的,即使这不是您习惯与Python dict进行交互的人所期望的。规范返回其值为列表的任何键的最后一个值。

https://runtime-typing.readthedocs.io

我相信这里的想法是要防止那种天真地假设您在索要/获得单个项目的代码在获取项目列表时就被炸毁的代码。

如果要获取整个列表:

    def perform_create(self, serializer):
        data = self.request.data
        print(data)
        print(data.getlist('teams')

应该可以解决问题。