【问题标题】:Access different serializer if a queryset is empty Django Rest Framework如果查询集为空,则访问不同的序列化程序 Django Rest Framework
【发布时间】:2021-09-29 11:07:22
【问题描述】:

我认为我没有正确实现这一点,但我正在尝试根据条件更改用于查询集的序列化程序(如果一个查询集中没有场所,则切换到另一个序列化程序并返回列表对象) .我不太确定该怎么做。

这里是风景

class SavedVenuesViewSet(viewsets.ModelViewSet):
    serializer_class = UserVenueSerializer
    
    def get_queryset(self):
        list_id = self.request.GET.get('list_id', None)
        user = self.request.user.id
        print(user)
        print(list_id)
        print(type(list_id))
        qs = UserVenue.objects.filter(user_list=int(float(list_id)))
        if not qs:    
            print("EMPTY LIST") #this is where i try to switch serializer
            serializer_class = UserListSerializer
            return UserVenue.objects.filter(id=int(float(list_id)))
        else:
            return qs

以下是相关的序列化程序:

class UserVenueSerializer(serializers.ModelSerializer):
    venue = mapCafesSerializer()
    
    class Meta:
        model = UserVenue
        fields = ['user', 'user_list', 'venue']
        depth = 2 

[...]

class UserListSerializer(serializers.ModelSerializer): 
    class Meta:
        model = UserList
        fields = ['id', 'user', 'list_name']
        depth = 2

回溯没有抛出错误,但它没有做我希望的事情:

1
45
<class 'str'>
EMPTY LIST
[29/Sep/2021 11:05:36] "GET /api/savedvenues/?list_id=45 HTTP/1.1" 200 2

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    这是在ModelViewSet 中更改serializer 类的正确做法:

    你必须重写get_serializesr_class方法:

    class SavedVenuesViewSet(viewsets.ModelViewSet):
        serializer_class = UserVenueSerializer
        
        def get_serializer_class(self):
            if not self.get_queryset():  # Check your conditions here
                return UserListSerializer
            else:
                return UserVenueSerializer
    

    【讨论】:

      【解决方案2】:

      您可以从视图中删除 serializer_class 字段,并创建 get_serializer_class() 方法,该方法将包含选择序列化程序的逻辑。是最佳做法。

      但是,您也可以在 get 查询集中执行此操作。

      首先,从您的视图中删除 serializer_class 属性。相反,将其设置在您的 get_queryset 方法中(使用 this.serializer_class);

      def get_queryset(self):
          list_id = self.request.GET.get('list_id', None)
          qs = UserVenue.objects.filter(user_list=int(float(list_id)))
          if not qs:
              self.serializer_class = UserVenueSerializer  
              return UserVenue.objects.filter(id=int(float(list_id)))
          else:
              self.serializer_class = UserListSerializer
              return qs
      

      别忘了使用 self.serializer_class。

      【讨论】:

      • 使用self 代替thisthis 是java的东西
      • 当然,你是对的......这是习惯的力量
      猜你喜欢
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2014-04-16
      • 2018-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-07-30
      • 1970-01-01
      相关资源
      最近更新 更多