Skip to main content
 首页 » 编程设计

python之Django 休息框架 serializer.save() 返回 "Invalid data. Expected a dictionary, but got group"

2024年10月01日22qq78292959

我正在尝试调用 serlizerer 以从 View 集中保存对象 这是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') 

这是模型.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." 
        ] 
    } 
} 

请您参考如下方法:

基于您的 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 时会引发异常.

假设您正在尝试使用 Group 外键创建一个 Log 对象,对于现有的 Group,快速破解将替换 data = {"group": group }与 data = {"group": group.__dict__ }