2016-10-16 10 views
0

私は私がやろうどのようないくつかのモデルDRF - ネストされたシリアライザ

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    gender = models.CharField(max_length=2) 
    name = models.CharField(max_length=200) 
    birthday = models.DateField(auto_now=False, auto_now_add=False) 
    weight = models.IntegerField(default=0) 
    heigth = models.IntegerField(default=0) 
    sign = models.CharField(max_length=200, choices=SIGNS_CHOICES, default='E') 
    orientation = models.CharField(max_length=200, choices=ORIENTATION_CHOICES, default='E') 
    bodytype = models.CharField(max_length=200, choices=BODYTYPE_CHOICES, default='E') 
    education = models.CharField(max_length=200, choices=EDUCATION_CHOICES, default='E') 
    religion = models.CharField(max_length=200, choices=RELIGION_CHOICES, default='E') 
    smoking = models.CharField(max_length=200, choices=SMOKING_CHOICES, default='E') 
    alcohol = models.CharField(max_length=200, choices=ALCOHOL_CHOICES, default='E') 
    kids = models.CharField(max_length=200, choices=KIDS_CHOICES, default='E') 
    pets = models.CharField(max_length=200, choices=KIDS_CHOICES, default='E') 
    location = models.CharField(max_length=100) 
    latitude = models.FloatField() 
    longtitude = models.FloatField() 

class ProfilePic(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    profilePic = models.ImageField(upload_to='Images/', default='Images/None/No-img.jpg') 

class ProfileFields(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    title = models.CharField(max_length=200) 
    text = models.TextField() 
    order = models.IntegerField(default=0) 

と、いくつかのserizlizers

class ProfilePicSerializer(ModelSerializer): 
    class Meta: 
     model = ProfilePic 
     fields = [ 
      'profilePic', 
      'user', 
     ] 

class ProfileSerializer(ModelSerializer): 
    class Meta: 
     model = Profile 
     fields = '__all__' 

class ProfileFieldsSerializer(ModelSerializer): 
    class Meta: 
     model = ProfileFields 
     fields = [ 
      'user', 
      'title', 
      'text', 
      'order' 
     ] 

を持っているプロファイルを表示するユーザーserizlizerを作成することで、profilePicとprofileFields

私はそれが好きです。

class UserSerializer(ModelSerializer): 
    profile = ProfileSerializer(many=False) 
    profilePic = ProfilePicSerializer(many=False) 
    profile_fields = ProfileFieldsSerializer(many=True) 

    class Meta: 
     model = User 
     fields = '__all__' 
     write_only_fields = ('password',) 
     read_only_fields = ('id',) 

    def create(self, validated_data): 
     user = User.objects.create(
      username=validated_data['username'], 
      email=validated_data['email'], 
     ) 

     user.set_password(validated_data['password']) 
     user.save() 

     return user 

しかし、私はエラー

Got AttributeError when attempting to get a value for field `profilePic` on serializer `UserSerializer`.The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.Original exception text was: 'User' object has no attribute 'profilePic'. 

Profileモデルを取得するには、JSONに追加されますが、一致すると属性ではない程度profilePicprofileFieldsリターンエラー。私はここで間違っていますか?

+0

セットアップを試したところ、すべて正常に動作しました。すべてのシリアライザから組み合わされたJSONを取り戻しました。 – C14L

+0

アイデアは、なぜ私は "ユーザー"オブジェクトに属性 "profilePic" –

答えて

0

ユーザーインスタンスのprofilePicが存在しないため、認識できません。 user.profilePicを実行しようとすると、同じエラーが発生します。

ProfilePicモデルユーザーForeignKeyにrelated_nameを設定して、ユーザーがprofilePicプロパティを持ち、user.profilePicがユーザーのプロファイルを返すようにする必要があります。

class ProfilePic(models.Model): 
    user = models.OneToOneField(User, related_name="profilePic", on_delete=models.CASCADE) 
    ... 
関連する問題