Django rest framework "Var должен быть пользовательским экземпляром" vs "Объект типа 'type' не поддерживает сериализацию JSON" - PullRequest
1 голос
/ 30 мая 2019

Я пытаюсь сериализовать модель с внешним ключом «Пользователь».Соответствующий фрагмент представления:

  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)

Когда я передаю объект супервизора, он говорит, чтоОбъект типа «Тип» не сериализуем, и когда я передаю supervisor в качестве словаря, он говорит, что переменная dict supervisor должна быть экземпляром User.Как мне разобраться в этом и продолжить ??

1 Ответ

2 голосов
/ 30 мая 2019

DRF обрабатывает большую часть самого анализа данных, и проанализированные данные можно найти в атрибуте request.data.

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

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


#views.py
<b>from rest_framework.response import Response # use DRF's response class</b>


class Foo(APIView):
    ...

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