Используя Django REST Framework, у меня есть следующий сериализатор:
class TagSelectOptionsSerializer(serializers.ModelSerializer):
label = serializers.CharField(source='title')
value = serializers.IntegerField(source='id')
class Meta:
model = Tag
fields = ('value', 'label')
read_only_fields = ('value', 'label', )
При попытке использовать его на мой взгляд (см. Ниже) я получаю следующую ошибку:
'QuerySet' object has no attribute 'id'
Может ли кто-нибудь сказать мне, как я могу получить доступ к полю первичного ключа, например, я получаю доступ к полю заголовка в приведенном выше сериализаторе?
class TagSelectOptions(APIView):
"""
...
"""
def get(self, request):
tags = Tag.objects.filter(approved=True)
if len(tags) > 1:
serializer = TagSelectOptionsSerializer(tags, many=True)
else:
serializer = TagSelectOptionsSerializer(tags)
return Response(serializer.data, status=rest_status.HTTP_200_OK)
Ваш метод получения неверен.
Когда длина результатов меньше или равна 1, вы все равно должны отправить many=True.
Потому что поведение API должно оставаться прежним. Схема JSON вернет список объектов во всех случаях.
Поэтому измените код на:
def get(self, request):
tags = Tag.objects.filter(approved=True)
# handles all cases by default
serializer = TagSelectOptionsSerializer(tags, many=True)
return Response(serializer.data, status=rest_status.HTTP_200_OK)
Но если вы действительно хотите вернуть только один объект, когда набор запросов возвращает только один результат, используйте:
def get(self, request):
tags = Tag.objects.filter(approved=True)
if len(tags) == 1:
serializer = TagSelectOptionsSerializer(tags[0])
else:
# when len > 1 or len == 0
serializer = TagSelectOptionsSerializer(tags, many=True)
return Response(serializer.data, status=rest_status.HTTP_200_OK)