AttributeError при попытке получить значение для поля

У меня очень странная проблема в моем проекте Django.

Вот моя модель:

class Connection(models.Model):
    user = models.ForeignKey(User, related_name='exchange_connections', on_delete=models.CASCADE)
    exchange = models.ForeignKey(Exchange, related_name='connection_exchange', on_delete=models.CASCADE)

    date_created = models.DateTimeField(auto_now_add=True, blank=True, null=True)
    last_updated = models.DateTimeField(auto_now=True, blank=True)

Вот мой сериализатор:

class ConnectionSer(serializers.ModelSerializer):

    class Meta:
        model = Connection
        fields = '__all__'

И мой взгляд:

class UserPortfolioViewSet(views.ModelViewSet):
    serializer_class = ConnectionSer
    queryset = Connection.objects.all()
    permission_classes = (permissions.IsAuthenticated, core_permissions.IsMineOnly)

    def list(self, request):
        try:
            user = request.user
        except:
            return HttpResponseBadRequest('No user')

        connections = user.exchange_connections.all()

        return Response(self.serializer_class(connections).data, status=status.HTTP_200_OK)

Я получаю эту ошибку из представления (GET):

Получили ошибку AttributeError при попытке получить значение для поля user на сериализатора ConnectionSer. Поле сериализатора может быть названо неправильно и не соответствует какому-либо атрибуту или ключу на экземпляре QuerySet. экземпляра. Оригинальный текст исключения был следующим: объект 'QuerySet' не имеет атрибут 'user'.

Что не имеет смысла, потому что я не создаю никакого свойства обмена в моем классе сериализатора...? И я также не понимаю последнюю строку: 'QuerySet' object has no attribute 'user'.

Похоже, что вы хотите фильтровать набор запросов на основе активного пользователя. Для этого вы можете переопределить метод get_queryset. Более того, у вас уже есть класс разрешения IsAuthenticated на вашем ViewSet, поэтому вам не нужно проверять активного пользователя:

class UserPortfolioViewSet(views.ModelViewSet):
    ...

    def get_queryset(self):

        # get the queryset:
        queryset = self.queryset

        # get the active user:
        user = self.request.user

        # filter queryset based on user:
        queryset = quseryset.filter(user=user)

        # return the fitlered queryset:
        return queryset

Эта ошибка вызвана передачей коллекции/списка экземпляров Connection в сериализатор, но при этом не отмечено, что сериализатор использует many=True, поэтому просто добавьте это для предотвращения ошибки:

        return Response(self.serializer_class(connections, many=True).data, status=status.HTTP_200_OK)
                                                          # ^^^ Add this

Но кроме этого, ответ @Daniel был бы лучшим способом, чтобы позволить ModelViewSet обрабатывать всю сериализацию за вас.

Вернуться на верх