我正在做一个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'
]
...