#python #django #django-rest-framework
#python #django #django-rest-framework
Вопрос:
Я создаю API с использованием Django rest framework. В настоящее время у меня есть конечная точка /api/v1/device-groups/
, которая возвращает все объекты группы устройств следующим образом:
[
{
"device_group_name": "Default",
"group_uuid": "3812a299-3ab9-4c00-a711-d166fb01075e",
"color": "4286f4",
"is_default": true,
"customer": {
"customer_name": "Testcustomer",
"customer_uuid": "179fe73d-ec67-45ac-8dac-e2456ccd9b48"
}
}
]
Использование customer_uuid
в URL показывает группы устройств, связанные с этим клиентом
/api/v1/device-groups/179fe73d-ec67-45ac-8dac-e2456ccd9b48
возвращает данные групп устройств, подключенных к указанному customer_uuid
Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда существует несколько групп устройств, связанных с customer_uuid
, это приводит к MultipleObjectsReturned
ошибке. Я хочу перечислить все группы устройств, которые связаны с указанным customer_uuid
.
Мой serializers.py
:
class CustomerSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Customer
fields = ('customer_name', 'customer_uuid')
class DeviceGroupSerializer(serializers.HyperlinkedModelSerializer):
customer = CustomerSerializer(many=False, read_only=True, source='customer_uuid')
class Meta:
model = DeviceGroup
fields = ('device_group_name', 'group_uuid', 'color', 'is_default', 'customer')
Мой views.py
:
class DeviceGroupViewSet(viewsets.ModelViewSet):
serializer_class = DeviceGroupSerializer
lookup_field = 'customer_uuid'
def get_queryset(self):
queryset = DeviceGroup.objects.all()
customer_uuid = self.request.query_params.get('customer_uuid', None)
if customer_uuid is not None:
queryset = queryset.filter(customer_uuid=customer_uuid)
return queryset
Что мне нужно изменить, чтобы были возвращены все группы устройств, связанные с customer_uuid
?
Комментарии:
1. зачем вы устанавливаете
many=False
, если вы хотите все?CustomerSerializer(many=False, read_only=True, source='customer_uuid')
2. Если я установил
many=True
,/api/v1/device-groups
выдаетTypeError: Customer object is not iterable
и/api/v1/device-groups/<customer_uuid>/
по-прежнему выдаетMultipleObjectsReturned
ошибку.3.
MultipleObjectsReturned
может означать, что вы используетеqueryset.get
там, где вы должны использоватьqueryset.filter
. Я предполагаю, что этот фрагмент кода отсутствует.