【问题标题】:Django rest Framework - Expected a list of items but got type "QuerySet"Django rest Framework - 需要一个项目列表但类型为“QuerySet”
【发布时间】:2020-02-16 15:43:59
【问题描述】:

我尝试序列化查询集。但我得到 {'non_field_errors': [ErrorDetail(string='Expected a list of items but got type "QuerySet".', code='not_a_list')]} 错误。如何解决这个错误。

    def post(self, request):
        data = request.data
        user_name = data.get('username')
        signup_filtered_data = Signup.objects.filter(username= user_name).values()
        print(signup_filtered_data)
        serializer = SignupSerializer(data= signup_filtered_data, many=True)
        serializer.is_valid()
        print(serializer.errors)
        signup_jason_data = json.dumps(serializer.data)
        return HttpResponse(signup_jason_data)

models.py

class Signup(models.Model):
    first_name = models.CharField(max_length=50, blank=True, null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    email = models.EmailField(max_length=50, unique= True)
    phone_number = models.CharField(max_length=12, unique= True)
    username = models.CharField(max_length=50, unique= True)
    password = models.CharField(max_length=50, blank=True, null=True)

序列化器.py

class SignupSerializer(serializers.ModelSerializer):

    class Meta:
        model = Signup
        fields = '__all__'

【问题讨论】:

  • 我无法理解您在这里要做什么。为什么您将查询集传递给序列化程序?
  • 我正在尝试从数据库中获取行数据,这就是为什么我在这里使用过滤器并传递用户名,并尝试以 json 格式返回数据。
  • 但是,如果您尝试从数据库中获取数据,为什么还要使用 post 方法呢?
  • 是的,我正在尝试从数据库中获取数据。
  • 我说了,那你为什么用post方法而不是get方法呢?

标签: django django-serializer


【解决方案1】:

更简洁的方法是使用基于类的视图的过滤器和序列化程序 一个例子是使用 mixins

Mixins DjangoRest

FilterBackend DjangoRest

Pagination DjangoRest

Permissions Classes DjangoRest

filters.py

class SignupFilter(django_filters.FilterSet):

    class Meta:
        model = Signup
        fields = [
            'user_name',
        ]

views.py

class YourNameView(mixins.CreateModelMixin,
                   viewsets.GenericViewSet):

    permission_classes = [permissions.IsAuthenticated, ] # Permission Classes
    pagination_class = PageNumberPagination # Pagination Classes
    serializer_class = SignupSerializer # Your Serializer
    filter_backends = [DjangoFilterBackend] #This need to added on settings.py
    filter_class = SignupFilter # Your filter Class
    queryset = Signup.objects.all() 

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

【讨论】:

    【解决方案2】:

    是你在将数据传递给序列化器时在视图中使用了many = True,但实际上你只是发送了一条消息。

    def post(self, request, formate = None):
       serializer = SignupSerializer(data= signup_filtered_data)
    

    查看实际答案: Actual answer

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2019-05-20
      • 2021-10-07
      • 2021-03-20
      • 2021-07-13
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多