2017-04-04 45 views
0

我無法使用郵遞員將數據發送到我的表單。它給出了以下錯誤。郵差嵌套外鍵錯誤

{「用戶」:「這是必須填寫」]}

我使用的是內置的用戶模型,並試圖在userinformations模型我的自定義字段映射。

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 : [email protected] 
first_name : bob 
middle_name : 
last_name : bob 
password : bob 
phone : +88017485367475 
date_of_birth : 2005-1-1 
vendor : True 
profile_pic : *picture link* 
+0

看起來你沒有在發佈的數據中包含'user'字段。爲了更加清晰,請添加您發佈的數據。 – AKS

+0

我編輯了問題以包含我的輸入。它適用於Django REST可瀏覽的API,但不適用於POSTMAN! –

+2

當你不發送'user'細節時,你期望它如何工作?錯誤本身非常清楚,'用戶'字段是必需的。 – AKS

回答

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 : [email protected] 
    password : bob 
+0

用戶的詳細信息是否有任何我可以讓它,所以我不必須如上所述以嵌套方式提供憑證? –

+0

那麼,你可以刪除UserSerializer和'user'字段,將相關字段直接添加到UserProfileSerializer,並在'create'函數中使用它們來手動創建User對象,但我不知道爲什麼想打擾。 –