Как мне исправить ошибку ‘MultipleObjectsReturned’ в Django rest framework

#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 . Я предполагаю, что этот фрагмент кода отсутствует.