Django REST框架-序列化程序关系User.username



我正在做一个django项目,我有一个模型看起来像这样:

class Comment(models.Model):
user            = models.ForeignKey(settings.AUTH_USER_MODEL, default=1,on_delete=models.CASCADE)
slug            = models.SlugField(unique=True,null=True, blank=True)
content_type    = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id       = models.PositiveIntegerField()
content_object  = GenericForeignKey('content_type', 'object_id')
parent          = models.ForeignKey("self", null=True, blank=True,on_delete=models.CASCADE)
content         = models.TextField()
timestamp       = models.DateTimeField(auto_now_add=True)
objects = CommentManager()
def __str__(self):
return str(self.user.username)

我使用这个序列化程序:

class CommentDetailSerializer(ModelSerializer):
user = SerializerMethodField()
replies = SerializerMethodField()
class Meta:
model = Comment
fields = [
'user',
'content',
'replies',
'timestamp'
]
def get_user(self,obj):
return str(obj.user.username)
def get_replies(self,obj):
if obj.is_parent:
return CommentChildSerializer(obj.children(),many=True).data

对于此视图:

class CommentDetailApiView(RetrieveAPIView):
queryset = Comment.objects.all()
serializer_class = CommentDetailSerializer
lookup_field = 'slug'

这是我使用的PostSerializer,

class PostSerializer(ModelSerializer):
user = SerializerMethodField()
comments = SerializerMethodField()
class Meta:
model = Post
fields = [
'user',
'title',
'content',
'comments'
]
def get_user(self,obj):
return str(obj.user.username)
def get_comments(self,obj):
comments_qs = Comment.objects.filter_by_instance(obj)
comments = CommentSerializer(comments_qs, many=True).data
return comments

这是我在PostDetailAPIView:中得到的


{
"user": "abc",
"title": "blabla",
"content": "bla",
"comments": [
{
"user": 1,
"content": "hey",
"timestamp": "2020-02-18T00:07:29.932850Z"
}
]
}

如何获得评论用户的用户名而不是id?

我只在CommentDetailApiView中获得评论用户的用户名。

谢谢

我将get_user方法添加到CommentSerializer中,现在它可以工作了:

class CommentSerializer(serializers.ModelSerializer):
user = SerializerMethodField()
class Meta:
model = Comment
fields = [
'user',
'content',
'timestamp'
]
def get_user(self,obj):
return str(obj.user.username)

您可以添加一个UserSerializer来指示您想要向用户显示的内容:

from django.contrib.auth.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('username',)
class CommentDetailSerializer(ModelSerializer):
user = UserSerializer()
..... # the rest of your code

您需要覆盖to_representation()函数,如下所示:

def to_representation(self, instance):
"""Convert `username` to lowercase."""
ret = super().to_representation(instance)
ret['username'] = ret['username'].lower()
return ret

上面的代码只是一个示例。它将以小写字母返回用户名。在您的情况下,只需更改线路

ret['username'] = ret['username'].lower()

ret['username'] = self.validated_data['username']

StringRelatedField可用于使用其__str__方法来表示关系的目标。

例如,下面的序列化程序。

class CommentDetailSerializer(serializers.ModelSerializer):
user = serializers.StringRelatedField()
...
class Meta:
model = Comment
fields = [
'user',
'content',
'replies',
'timestamp'
]
...

相关内容

最新更新