邮差嵌套外键错误

时间:2017-04-04 06:52:12

标签: django django-rest-framework

我无法使用邮递员将数据发送到我的表单。它给出了以下错误。

{“user”:[“此字段是必填项。”]}

我正在使用内置的用户模型,并尝试将其与用户信息模型中的自定义字段进行映射。

models.py

class UserInformation(BaseModel):

    user = models.OneToOneField(User, related_name='user_id')
    first_name = models.CharField(max_length=45)
    middle_name = models.CharField(max_length=45, null=True)
    last_name = models.CharField(max_length=45)
    vendor = models.BooleanField(default=True)
    phone = models.CharField(max_length=100, validators=[
    RegexValidator(regex=r'^\+?8801?\d{9}$', message="Phone number must be entered in the format: '+8801*********'")
    ], blank=False, unique=True)
    date_of_birth = models.DateField()
    confirmation_token = models.CharField(max_length=45, null=True)
    confirmation_exp = models.DateTimeField(null=True)
    pw_reminder_token = models.CharField(max_length=45, null=True)
    pw_reminder_exp = models.DateTimeField(null=True)
    profile_pic = models.ImageField(blank=True, null=True, upload_to='profile_images/', default='Images/none/no_images.jpg')
    cover_photo = models.ImageField(blank=True, null=True, upload_to='cover_images/', default='Images/none/no_images.jpg')
    thumbnail_pic = models.ImageField(blank=True, null=True, upload_to='thumbnail_images/', default='Images/none/no_images.jpg')
    phone_verified = models.BooleanField(default=False)
    email_verified = models.BooleanField(default=False)
    reward_points = models.IntegerField(null=False, default=0)
    ref_code = models.CharField(null=True, max_length=10)

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

    def delete(self, *args, **kwargs):
        self.user.delete()
        super(UserInformation, self).delete(*args, **kwargs)

serializers.py

class UserSerializer(ModelSerializer):

    password = serializers.CharField(style={'input_type': 'password'}, write_only=True)
    email = serializers.EmailField(validators=[required])

    class Meta:
        model = User
        fields = ['username', 'email', 'password', 'is_active']
        extra_kwargs = {'password': {'write_only': True},
                        }

    def validate(self, data):
        email = data.get('email', None)
        user = User.objects.filter(email=email).distinct()
        if user.exists():
            raise ValidationError("That email is already registered!")
        return data


class UserProfileSerializer(ModelSerializer):
    user = UserSerializer(required=True)
    profile_pic = serializers.ImageField(use_url=True, required=False)
    cover_photo = serializers.ImageField(use_url=True, required=False)
    thumbnail_pic = serializers.ImageField(use_url=True, required=False)

    class Meta:
        model = UserInformation
        fields = ['user', 'first_name', 'middle_name', 'last_name', 'profile_pic', 'cover_photo', 'thumbnail_pic',
                  'vendor', 'phone', 'date_of_birth', 'confirmation_token', 'created_by']
        extra_kwargs = {'confirmation_token': {'read_only': True}, 'created_by': {'read_only': True}}

    def create(self, validated_data):
        user_data = validated_data.pop('user', None)
        user = User.objects.create_user(**user_data)
        user_object = User.objects.get(pk=user.id)
        verification = ''.join(choice(ascii_uppercase) for i in range(5))

        return UserInformation.objects.create(user=user, confirmation_token=verification, created_by = user, **validated_data)

views.py

class UserCreateAPIView(ListCreateAPIView):

    #permission_classes = [AllowAny]
    queryset = UserInformation.objects.all()
    serializer_class = UserProfileSerializer

发送以下数据:

username : bob
email : bob@bob.com
first_name : bob
middle_name : 
last_name : bob
password : bob
phone : +88017485367475
date_of_birth : 2005-1-1
vendor : True
profile_pic : *picture link*

1 个答案:

答案 0 :(得分:0)

正如错误所说,您没有包含用户信息,所以我不确定为什么您对这不起作用感到惊讶。

您已将序列化程序配置为期望包含该信息的user键,因此您应该以这种方式提供它。

first_name : bob
middle_name : 
last_name : bob
phone : +88017485367475
date_of_birth : 2005-1-1
vendor : True
profile_pic : *picture link*
user:
    username : bob
    email : bob@bob.com
    password : bob