Как получить доступ к объекту из PK другого объекта в ModelViewSet - PullRequest
0 голосов
/ 19 марта 2019

Общая структура моделей такова, что существуют учителя и устройства, каждое устройство имеет отношение ForeignKey с идентификатором учителя / ПК.

Я пытаюсь создать свой API таким образом, чтобы при переходе к подробному представлению для учителя отображались все связанные с ним устройства. Я переопределил get_serializer_class () , чтобы указать, какой сериализатор использовать в соответствующее время, но не могу понять, как правильно изменить набор запросов на основе подробного представления или нет. Ошибка размещена ниже.

Got AttributeError when attempting to get a value for field `brand` on serializer `DeviceSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Teacher` instance.
Original exception text was: 'Teacher' object has no attribute 'brand'.

class TeacherViewSet(viewsets.ModelViewSet):
    queryset = Teacher.objects.order_by('campus','name')
    serializer_class = TeacherSerializer
    detail_serializer_class = DeviceSerializer

    def get_serializer_class(self):
        if self.action == 'retrieve':
            if hasattr(self, 'detail_serializer_class'):
                return self.detail_serializer_class
        return super(TeacherViewSet, self).get_serializer_class()

    def get_queryset(self, pk=None):
        if pk is not None:
            return Device.objects.filter(device__owner=self.kwargs.get('pk')
        return Teacher.objects.all()

Ответы [ 2 ]

2 голосов
/ 19 марта 2019

Мне удалось получить желаемый результат, добавив вложенный DeviceSerializer в мой TeacherSerializer, который анализирует список объектов устройства.

class TeacherSerializer(serializers.ModelSerializer):
devices = DeviceSerializer(many=True)

class Meta:
    model = Teacher
    fields = ('id', 'name', 'campus', 'email', 'devices')
0 голосов
/ 19 марта 2019

Я предполагаю, что вы используете DRF.Если это так, просто настройте TeacherSerializer на что-то вроде:

def TeachSearializer(serializer.ModelSerializer):
    devices = serializers.SerializerMethodField()

    class Meta:
        model = Teacher
        fields = '__all__'

    def get_devices(self, obj):
        return Devices.objects.filter(teacher=obj)

И это все, каждый раз, когда вы используете сериализатор для объекта учителя, их устройства будут добавляться в поле devices

...