【问题标题】:How to access an object from PK of another object in ModelViewSet如何从 ModelViewSet 中另一个对象的 PK 访问一个对象
【发布时间】:2019-03-19 08:33:01
【问题描述】:

模型的通用结构是有教师和设备,每个设备与教师ID/PK都有一个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()

【问题讨论】:

    标签: django rest django-rest-framework api-design


    【解决方案1】:

    我能够通过在我的 TeacherSerializer 中添加一个嵌套的 DeviceSerializer 来解析设备对象列表,从而获得所需的输出。

    class TeacherSerializer(serializers.ModelSerializer):
    devices = DeviceSerializer(many=True)
    
    class Meta:
        model = Teacher
        fields = ('id', 'name', 'campus', 'email', 'devices')
    

    【讨论】:

      【解决方案2】:

      我假设您正在使用 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

      【讨论】:

      • 所以在执行此操作后,我得到 Device 类型的 Object is not JSON serializable,我想知道是否需要从 TeacherSerializer 中序列化 Device 对象
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 2013-05-02
      • 2013-09-23
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多