【问题标题】:drf error, 'Expected a dictionary, but got QuerySet.'drf 错误,“需要字典,但得到了 QuerySet。”
【发布时间】:2022-01-13 12:56:31
【问题描述】:

我在使用 drf 函数视图时遇到问题,我收到如下的序列化程序错误: {'non_field_errors': [ErrorDetail(string='无效数据。需要字典,但得到了 QuerySet。', code='invalid')]} 这是我的基于函数的视图:

@api_view(["GET","POST"])
def UserSearch(request):
    selected_users = Profile.objects.all()
    serializer = UserProfileSerializer(data=selected_users)
    if serializer.is_valid():
        return Response(data=serializer.data)
    else:
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

我的序列化器:

class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('user','name','surname','gender','country','city','sport')
        model = Profile

和配置文件模型:

class Profile(models.Model):
    user = models.OneToOneField(User,on_delete=models.CASCADE)

    name = models.CharField(max_length=50, blank=True)
    surname = models.CharField(max_length=50, blank=True)
    gender = models.CharField(max_length=50, blank=True)

    country = models.CharField(max_length=50, blank=True)
    city = models.CharField(max_length=50, blank=True)
    sport = models.CharField(max_length=60, blank=True)

    #date_of_birth = models.DateField()
    def __str__(self):
        return f"{self.name} {self.surname} from {self.city}"

【问题讨论】:

    标签: python django serialization django-rest-framework


    【解决方案1】:

    你的问题在这里:

    serializer = UserProfileSerializer(data=selected_users)
    

    这一定是

    serializer = UserProfileSerializer(selected_users, many=True)
    

    data= 不应出现在此处,数据仅适用于 python dict,例如当您要序列化 ​​python dict 时。

    为什么many=True,因为你查询的表行不止1个,所以需要很多

    您的最终代码将是:

    @api_view(["GET","POST"])
    def UserSearch(request):
        selected_users = Profile.objects.all()
        serializer = UserProfileSerializer(selected_users, many=True) # <------
        if serializer.is_valid():
            return Response(data=serializer.data)
    
        # that else was redundant
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
    

    【讨论】:

    • 当我改变它时,我得到了另一个错误:{'non_field_errors': [ErrorDetail(string='Expected a list of items but got type "QuerySet".', code='not_a_list')] }
    • 和选定的用户如下所示:, , , , , ]>
    • 是的。删除data=。检查答案,我已经更新了。
    • 现在开始工作了。
    • 如果您想验证数据,您必须在序列化程序类中创建一个名为validate(self) 的自定义函数,并且您需要自定义条件。之后你就靠自己了。
    猜你喜欢
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2023-01-01
    • 2020-12-20
    • 2015-12-01
    • 2021-04-03
    相关资源
    最近更新 更多