序列化嵌套外键对象

时间:2020-10-22 01:06:58

标签: python django serialization django-rest-framework

无论谁在阅读本文,希望您一切都好。 我正在创建一个社交媒体应用程序,其中包含与其他社交媒体网站一样的帖子,喜欢和评论,我正尝试通过序列化程序将数据从后端发送到前端,我遇到的问题是我不是能够获得全部数据但部分数据的输出。以下表示我要序列化的对象的models.py

models.py

class User(AbstractUser):
    contact_no = models.CharField(max_length=15,null=True,blank=True)
    profile_picture=models.ImageField(upload_to=to_upload,default="defaultprofile.jpg")

class Post(models.Model):
    posted_by=models.ForeignKey(User,on_delete=models.CASCADE)
    date= models.DateField(auto_now=True)
    time=models.TimeField(auto_now=True)
    content=models.CharField(max_length=2000)
    media=models.ImageField(default=None,blank=True,upload_to=to_upload_post)

class Like(models.Model):
    Liked_by=models.ForeignKey(User,on_delete=models.CASCADE,related_name="likes")
    post=models.ForeignKey(Post,on_delete=models.CASCADE)
    date = models.DateField(auto_now=True)
    time = models.TimeField(auto_now=True)

和我正在使用的序列化器是

serializers.py

class UserSerializer(serializers.ModelSerializer):
   
    class Meta:
        model=User
        fields=['id','username','first_name','last_name','profile_picture']

class LikeSerializer(serializers.ModelSerializer):
    Liked_by=UserSerializer()
    class Meta:
        model=Like
        fields=['Liked_by']

class PostSerializer(serializers.ModelSerializer):
    posted_by=UserSerializer()
    likes=LikeSerializer(many=True)

    class Meta:
        model=Post
        fields=['posted_by','id','content','date','time','media','likes']

这在导入时不会引发任何错误,但不能提供完整的数据。

我得到的输出是

 {
   'posted_by': 
              OrderedDict([
                           ('id', 7), 
                           ('username', 'user'), 
                           ('first_name', ''), 
                           ('last_name', ''), 
                           ('profile_picture', '/media/defaultprofile.jpg')]), 
  'id': 4, 
  'content': 'This is a test post for likes', 
  'date': '2020-10-22', 
  'time': '05:34:55.979863', 
  'media': None
}

但是我想要得到的是

所需的输出

{
   'posted_by': 
              OrderedDict([
                           ('id', 7), 
                           ('username', 'user'), 
                           ('first_name', ''), 
                           ('last_name', ''), 
                           ('profile_picture', '/media/defaultprofile.jpg')]), 
  'id': 4, 
  'content': 'This is a test post for likes', 
  'date': '2020-10-22', 
  'time': '05:34:55.979863', 
  'media': None
  'likes':
          ['Liked_by':
                     OrderedDict([
                           ('id', 1), 
                           ('username', 'user1'), 
                           ('first_name', ''), 
                           ('last_name', ''), 
                           ('profile_picture', '/media/defaultprofile.jpg')
]
)
  
}

任何线索,帮助或任何战略建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

尝试以与“ Liked_by”字段相同的方式设置related_name

post=models.ForeignKey(Post,on_delete=models.CASCADE, related_name='likes')

不幸的是,django rest框架掩盖了某些异常,因为它试图捕获包括AttributeError在内的某些异常以执行字段存在性检查。

答案 1 :(得分:0)

几件事要注意:

  1. 序列化器处理数据,而不处理序列化器类。相反,您需要创建SerializerMethodField()并为其创建一个吸气剂。
  2. 为避免因请求而向数据库发送垃圾邮件,请记住将.select_related()/ .prefetch_related()添加到QuerySet中。
  3. 使用小写字段名称被认为是一种好习惯:)

示例:

class LikeSerializer(serializers.ModelSerializer):
    Liked_by = serializers.SerializerMethodField()
    class Meta:
        model=Like
        fields=['Liked_by']
    
    def get_Liked_by(self, instance):
        return UserSerializer(instance.Liked_by, many=False).data