Mar*_* M. 2 django django-rest-framework
我的模型如下所示:
class User(TimestampedModel):
name = models.CharField(max_length=30, null=False, blank=False)
device = models.CharField(max_length=255, null=False, blank=False)
class Comment(TimestampedModel):
user = models.ForeignKey(User, on_delete=models.PROTECT, blank=True, null=True)
contents = models.CharField(max_length=510)
rating = models.IntegerField(blank=False, null=False)
Run Code Online (Sandbox Code Playgroud)
我的序列化器如下所示:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('name',)
class CommentListItemSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Comment
fields = ('user', 'contents', 'rating')
Run Code Online (Sandbox Code Playgroud)
和视图:
class CommentsList(generics.ListAPIView):
serializer_class = CommentListItemSerializer
queryset = Comment.objects.all()
Run Code Online (Sandbox Code Playgroud)
它几乎完成了工作;)。我得到的响应如下所示:
"results": [
{
"user": {
"name": "Ania"
},
"contents": "Very good",
"rating": 6
},
{
"user": {
"name": "Anuk"
},
"contents": "Not very good",
"rating": 1
}
]
Run Code Online (Sandbox Code Playgroud)
该响应有两个问题。
"username"。序列化程序为每个用户进行数据库查询(不是联接,而是一个单独的查询),以获取其姓名。
您可以在视图的属性上使用select_related()queryset。然后访问user.name将不会导致进一步的数据库查询。
class CommentsList(generics.ListAPIView):
serializer_class = CommentListItemSerializer
queryset = Comment.objects.all().select_related('user') # use select_related
Run Code Online (Sandbox Code Playgroud)
我不想有这个嵌套的对象
"user.name"。我想将其作为一个简单的字符串字段接收,例如"username"
您可以使用参数在序列化程序中定义一个只读username字段source。这将返回一个username字段作为响应。
class CommentListItemSerializer(serializers.ModelSerializer):
# define read-only username field
username = serializers.CharField(source='user.name', read_only=True)
class Meta:
model = Comment
fields = ('username', 'contents', 'rating')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2210 次 |
| 最近记录: |