Django rest framework serializer.save()返回“无效数据。需要字典,但得到组“

2024-10-05 10:43:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图调用serlizer从视图集中保存对象 这是views.py

class GroupViewSet(viewsets.ViewSet):
        ....
        @detail_route(methods=['post'], url_path='task')
        def get_task(self, request, pk=None):
            group = get_object_or_404(Group, pk=pk)
            data = {"group": group }
            log_serializer = LogSerializer(data=data)
            if log_serializer.is_valid(raise_exception=True):
                log_serializer.save()

这是serializer.py

class GroupSerializer(serializers.ModelSerializer):
    class Meta:
        model = Group
        fields = ('id', 'name')

class LogSerializer(serializers.ModelSerializer):
    group = GroupSerializer()
    class Meta:
        model = Log
        fields = ('group', 'created')

这是model.py:

class Group:
....

class Log(models.Model):
    user = models.ForeignKey(User)
    group = models.ForeignKey(Server) #Not the group of user , it is the group id which user try to query 
    created = models.DateTimeField(auto_now_add=True)

岗位职责

{
    "group": {
        "non_field_errors": [
            "Invalid data. Expected a dictionary, but got group."
        ]
    }
}

Tags: pylogtaskdatagetmodelismodels
1条回答
网友
1楼 · 发布于 2024-10-05 10:43:01

基于您的LogSerializer,当您将数据属性传递给序列化程序时,它需要这样的字典:

{
    // note this is a dictionary or a JSON Object.
    // id is omitted because it's auto-inserted natural key
    {
        'name': 'group-name'
    },
    'created': '2017-11-06 20:17:59'
}

但是,您传递了一个组实例,从这里可以得到:group = get_object_or_404(Group, pk=pk),因此在调用.is_valid时会引发异常。

假设您试图用组外键创建一个日志对象,对于一个现有组,一个快速的方法将data = {"group": group }替换为data = {"group": group.__dict__ }

相关问题 更多 >

    热门问题