django rest框架中嵌套序列化程序上的筛选器

django rest框架中嵌套序列化程序上的筛选器,django,django-rest-framework,Django,Django Rest Framework,我正在使用django rest框架在django中构建一个序列化程序。我需要为嵌套模型筛选查询集 我发现,这似乎有答案,但当我实现它时,我的数据没有变化。我能看到的唯一区别是引用过滤列表序列化程序的序列化程序也有其他字段 模型(为清晰起见缩写): 这是我的密码: class FilteredListSerializer(serializers.ListSerializer): def to_representation(self, data): data = data.

我正在使用django rest框架在django中构建一个序列化程序。我需要为嵌套模型筛选查询集

我发现,这似乎有答案,但当我实现它时,我的数据没有变化。我能看到的唯一区别是引用过滤列表序列化程序的序列化程序也有其他字段

模型(为清晰起见缩写):

这是我的密码:

class FilteredListSerializer(serializers.ListSerializer):
    def to_representation(self, data):
        data = data.filter(status=constants.Status.ASSIGNED).order_by('start_time')
        return super(FilteredListSerializer, self).to_representation(data)


class UserEventSerializer(serializers.ModelSerializer):
    class Meta:
        list_serializer_class = FilteredListSerializer
        model = models.Event
        fields = ('id', 'event_name', 'conflict_type', 'start_time', 'end_time')


class UserConnectionSerializer(serializers.ModelSerializer):
    event = UserEventSerializer()

    class Meta:
        model = models.Connection
        fields = ('get_role_display', 'conflict_type', 'event')


class GCUserSerializer(serializers.ModelSerializer):
    user_connection = UserConnectionSerializer(many=True)

    class Meta:
        model = models.GCUser
        fields = ('pk', 'first_name', 'last_name', 'email',
                  'is_member', 'age', 'user_connection')
PyCharm告诉我“类FilteredListSerializer必须实现所有抽象方法”,但它实际上并没有抛出错误。我在列表序列化程序的第一行放置了一个断点,但它没有被触发

我正在使用Python3.4和django 1.7

提前感谢你的帮助


编辑添加:查看序列化程序代码,我意识到了关键区别:我的调用有
many=True
,而上一篇文章中的调用没有。我试着去掉
模型=
,但正如预期的那样,它抛出了一个错误,因此前面文章中的“工作”代码显然没有按照编写的方式运行。

因此我不确定如何使用您正在使用的方法,但是,如果我正确理解您的问题,我相信您可以这样做:

  class UserEventSerializer(serializers.ModelSerializer):
    class Meta:
      model = models.Event
      fields = ('id', 'event_name', 'conflict_type', 'start_time', 'end_time')

  class UserConnectionSerializer(serializers.ModelSerializer):
    event = serializers.SerializerMethodField()

    class Meta:
        model = models.Connection
        fields = ('get_role_display', 'conflict_type', 'event')

    def get_event(self, obj):
      if obj.event.status == constants.Status.ASSIGNED:
        serializer = UserEventSerializer(obj.event)
        return serializer.data
      else:
        serializer = UserEventSerializer(None)
        return serializer.data
注意:如果未分配事件的状态,则假定您试图将其从序列化中排除


我希望这有帮助。如果我不理解这个问题,请告诉我。

从您的示例来看,似乎没有嵌套用于序列化的模型。你能解释一下你想要过滤和序列化哪个相关的模型吗?我已经编辑了OP,包括了模型和整个序列化程序链。我刚才也遇到了同样的问题。最初,当我编写序列化程序时,抽象警告并不存在,但今天却存在。我不知道它是如何修复的,但我在pycharm上运行了invalidate cache和restart,警告消失了。遗憾的是,没有,我仍然看到状态不是Assigned的事件。我确实认为你理解这个问题。我可以看到你的代码打算做什么,这正是我想要的。再看一遍,我意识到我错过了你提出的一个更改。将其放入导致以下结果:异常类型:AssertionError异常值:在序列化程序“UserConnectionSerializer”中的SerializerMethodField“event”上指定“get_事件”是多余的,因为它与默认方法名称相同。删除“method\u name”参数。我编辑了答案以删除“method\u name”参数,更改是否有效?它运行正常,但仍显示所有未分配但所有字段均为空的事件。我取出else子句,用None调用序列化程序,如果没有分配事件,则返回None。这些事件仍然显示,但事件为None,而不是一个填充了null的对象。这并不理想,但却是一种进步。现在我要是能按开始时间把它们分类就好了。。。
  class UserEventSerializer(serializers.ModelSerializer):
    class Meta:
      model = models.Event
      fields = ('id', 'event_name', 'conflict_type', 'start_time', 'end_time')

  class UserConnectionSerializer(serializers.ModelSerializer):
    event = serializers.SerializerMethodField()

    class Meta:
        model = models.Connection
        fields = ('get_role_display', 'conflict_type', 'event')

    def get_event(self, obj):
      if obj.event.status == constants.Status.ASSIGNED:
        serializer = UserEventSerializer(obj.event)
        return serializer.data
      else:
        serializer = UserEventSerializer(None)
        return serializer.data