【问题标题】:Unable to POST data with foreign key relationship - Django rest无法使用外键关系发布数据 - Django rest
【发布时间】:2019-03-03 00:45:00
【问题描述】:

这是我的模型:

用户 - 我使用的是 django admin 提供的默认用户

class UserProfile(models.Model):
    user = models.ForeignKey(User,on_delete=CASCADE,related_name='user')
    phonenumber=models.IntegerField()
    picture=models.CharField(max_length=20,null=True)
    #dp=models.ImageField(upload_to='profile_pics',blank=True)
    points=models.IntegerField(default=0)

    def __str__(self):
        return self.user.name

    def __repr__(self):
        return str(self.user.name)

这是我尝试发布数据的视图

class UserCreate(generics.CreateAPIView):
    queryset=User.objects.all()
    serializer_class=None
    def get_serializer_class(self, *args, **kwargs):
        if(self.request.method=='GET'):
            return UserSerializer
        return CreateUserSerializer

    def post(self,request,format=None):

        user=CreateUserSerializer(data=request.data)
        if(user.is_valid()):
            user.save()

这是我的序列化器

class CreateUserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()
    username = serializers.CharField(max_length=100)
    password = serializers.CharField(max_length=255)
    userprofile = UserProfileSerializer(required=True)
    class Meta:

        fields=('username','password','email','userprofile')
        model=models.User      

    def create(self, validated_data):
        """
        Create and return a new `User` instance, given the validated data.
        """
        userprofile = validated_data.pop('userprofile')
        instance = super(CreateUserSerializer, self).create(validated_data)
        instance.save()
        return instance
                profile=UserProfileSerializer(data=request.data)
            if profile.is_valid():
                profile.save() 
                return Response(user.data, status=201)
            return Response(user.errors, status=400)

class UserProfileSerializer(serializers.ModelSerializer):

    class Meta:

        fields=('phonenumber','picture')
        model=models.UserProfile
    def create(self, validated_data):
        profile = super(UserProfileSerializer,self).create(validated_data)
        profile.save()
        return profile 

用户被正确保存。问题仅出现在 UserProfile 中。它说:

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

我知道它需要在“用户”中使用“用户配置文件”,但我必须在 CreateUserSerializer 中删除它才能正确保存用户。现在必须做什么?我是 django 的新手。

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

    UserProfile 上的 related_name User 关系与序列化程序中的字段不匹配。您在ForeignKey 中将'user' 设置为相关名称,但您在序列化程序中使用了userprofile。更改其中任何一个以匹配另一个,问题应该得到解决。

    【讨论】:

    • 好的,我明白了。收到数据后,我会与用户一起获取用户个人资料详细信息。不可能同时保存两者。我的理解是,我需要先保存用户,然后再保存用户配置文件。但是在保存用户时,我不得不从验证数据中删除 'userprofile' 。我怎样才能再次访问它?这里有点困惑
    • 问题不在您的序列化程序中。那些看起来不错。检查模型的定义,您在关系的related_name 中有不同的名称,并且您在序列化程序中使用了不同的名称。这会导致 django-rest-framework 无法连接这两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 2014-09-21
    • 2015-12-07
    • 2022-01-04
    • 1970-01-01
    相关资源
    最近更新 更多