【问题标题】:'QuerySet' object has no attribute 'phone' in Model Serializer django rest'QuerySet' 对象在 Model Serializer django rest 中没有属性'phone'
【发布时间】:2019-03-20 09:40:46
【问题描述】:

我正在使用 Django rest Api 构建一个项目。我有一个名为 DriverProfile 的模型现在我必须添加一个驱动程序配置文件,但出现以下错误:

尝试获取字段 phone 的值时出现 AttributeError 在序列化程序DriverProfileCreateSerializer 上。序列化程序字段可能命名不正确,并且与QuerySet 实例上的任何属性或键都不匹配。原始异常文本是:“QuerySet”对象没有属性“电话”

我使用了 APIView 和 modelSerializer,但我不知道为什么会出现,而 DriverProfile 中存在 phone 字段。 重要的是,当我从通用视图而不是 APIView 执行此操作时,它可以工作,但是当我使用模型序列化程序和 API 视图时,它会引发错误。我猜错误是在我使用 driverprofile = DriverProfile.objects.all 的模型序列化程序中的 create() 中(),我无法排序,请高人指点。

Models.py:

class Driver(models.Model):
    User=models.ForeignKey(User,on_delete=models.CASCADE)
    objects = models.Manager()

class DriverProfile(models.Model):
    driver=models.OneToOneField(Driver,on_delete=models.CASCADE)
    drive_name=models.CharField(max_length=20,blank=True)
    phone=models.CharField(max_length=12)
    driver_cnic=models.CharField(max_length=13)

Views.py

class CreateDriverProfile(APIView):

    def get(self,request):
        return Response([DriverProfileCreateSerializer(driver).data for driver in DriverProfile.objects.all()])

    def post(self,request):
        payload=request.data
        serializer=DriverProfileCreateSerializer(data=payload)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data,status=status.HTTP_201_CREATED)
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

Serializer.py:

class DriverProfileCreateSerializer(serializers.ModelSerializer): # create driver profile

    class Meta:
        model=DriverProfile
        fields = '__all__'

    def create(self, validated_data):
        driverprofile = DriverProfile.objects.all()
        return driverprofile

    def update(self, instance, validated_data):
        for k, v in validated_data.items():
            setattr(instance, k, v)
            instance.save()
        return instance

【问题讨论】:

    标签: django-rest-framework django-serializer


    【解决方案1】:
    • 像这样更改您的DriverProfileCreateSerializer
    class DriverProfileCreateSerializer(serializers.ModelSerializer): # create driver profile
    
        class Meta:
            model=DriverProfile
            fields = '__all__'
    
        def create(self, validated_data):
            driverprofile = DriverProfile.objects.create(**validated_data) # HERE!
            return driverprofile
    
        def update(self, instance, validated_data):
            for k, v in validated_data.items():
                setattr(instance, k, v)
                instance.save()
            return instance
    
    
    

    【讨论】:

    • 我已经尝试过了,但是在添加 **validated_data 后得到了这个错误“all() got an unexpected keyword argument 'drive_name'”
    • 你能告诉我们你的数据是什么样子的吗?您发送的数据键可能与您的 python 模型类字段不匹配。 @MuhammadNabeel
    • 好的,我添加了 .all(**validated_data) 而不是 .create(**validated_data)。谢谢
    猜你喜欢
    • 2020-02-11
    • 2016-06-30
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2021-08-05
    • 2017-06-22
    相关资源
    最近更新 更多