【问题标题】:Django rest framework "Var must be a User Instance" vs "Object of type 'type' is not JSON serializable"Django 休息框架“Var 必须是用户实例”与“‘类型’类型的对象不是 JSON 可序列化的”
【发布时间】:2019-05-30 00:47:29
【问题描述】:

我正在尝试序列化具有外键“用户”的模型。 关心的视图sn-p是:

  data = JSONParser().parse(request)
    serializer = SiteSerializer(data=data)

    if serializer.is_valid():
        userid = data['supervisor']

        user = User.objects.get(id=userid).__dict__ ## tried case I 
        user = User.objects.get(id=userid) ## tried case II
        serializer.save(supervisor=user)
        return JsonResponse(serializer.data, status=201)

序列化器如下:

class SiteSerializer(serializers.ModelSerializer):
supervisor = serializers.RelatedField(source='User', read_only=True)
class Meta:
    model = Site
    fields = ('sitename', 'start_date', 'supervisor')

型号是:

class Site(models.Model):
sitename=models.CharField(max_length=255)
start_date=models.DateTimeField
supervisor=models.ForeignKey(User,on_delete=models.PROTECT)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

def __str__(self):
    return "{}".format(self.sitename)

当我传递主管对象时,它说“类型”类型的对象不可序列化,当我将主管作为字典传递时,它说 dict 变量主管必须是用户实例。 我该如何解决这个问题并继续?

【问题讨论】:

  • 你为什么使用data = JSONParser().parse(request)而不是直接使用serializer = SiteSerializer(data=request.data)
  • 这一行start_date=models.DateTimeField(类)必须是start_date=models.DateTimeField()(实例)
  • @DaniloAkamine 我在第一条评论中尝试了你的建议,它给出了错误为{"non_field_errors": ["Invalid data. Expected a dictionary, but got WSGIRequest."]},这意味着serializer.is_valid() 这样做会失败。您在第二条评论中提到的事情,感谢您指出。它已经看不见了。

标签: django django-rest-framework foreign-keys


【解决方案1】:

DRF 自己处理大部分数据解析,解析后的数据可以在 request.data 属性中找到。

# serializers.py
class SiteSerializer(serializers.ModelSerializer):
    supervisor = serializers.RelatedField(read_only=True) # remove "source argument "

    class Meta:
        model = Site
        fields = ('sitename', 'start_date', 'supervisor')


#views.py
from rest_framework.response import Response # use DRF's response class


class Foo(APIView):
    ...

    def post(self, request, *args, **kwargs):
        serializer = SiteSerializer(data=request.data) # use "request.data"
        if serializer.is_valid():
            serializer.save(supervisor=request.user) # pass user instance directly to the serializer/model saving flow using "request.user"
            return Response(serializer.data)
        else:
            return Response(serializer.errors) # show validation errors if any

【讨论】:

    猜你喜欢
    • 2021-06-18
    • 2017-06-17
    • 2020-07-05
    • 2020-12-02
    • 2021-12-03
    • 2019-09-28
    • 1970-01-01
    • 2020-03-04
    • 2019-04-29
    相关资源
    最近更新 更多