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
обрабатывать всю сериализацию за вас.