如何从 ModelViewSet 中另一个对象的 PK 访问一个对象
How to access an object from PK of another object in ModelViewSet
模型的通用结构是有教师和设备,每个设备与教师有外键关系ID/PK。
我正在尝试创建我的 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()
我假设您正在使用 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
我能够通过在解析设备对象列表的 TeacherSerializer 中添加嵌套的 DeviceSerializer 来获得所需的输出。
class TeacherSerializer(serializers.ModelSerializer):
devices = DeviceSerializer(many=True)
class Meta:
model = Teacher
fields = ('id', 'name', 'campus', 'email', 'devices')
模型的通用结构是有教师和设备,每个设备与教师有外键关系ID/PK。
我正在尝试创建我的 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()
我假设您正在使用 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
我能够通过在解析设备对象列表的 TeacherSerializer 中添加嵌套的 DeviceSerializer 来获得所需的输出。
class TeacherSerializer(serializers.ModelSerializer):
devices = DeviceSerializer(many=True)
class Meta:
model = Teacher
fields = ('id', 'name', 'campus', 'email', 'devices')