gpt4 book ai didi

python - Django REST 框架 - 获取数据而不是链接

转载 作者:行者123 更新时间:2023-12-01 03:27:34 25 4
gpt4 key购买 nike

我查了一下,没有找到这个问题的答案。

序列化器.py

class PostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Post
fields = ['title', 'body', 'comments', 'user', 'date']

class CommentSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Comment
fields = ['body', 'user', 'date']

class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['id', 'user']

模型.py

class Post(models.Model):
# Children
comments = models.ManyToManyField('Comment', blank=True)

# Content
title = models.TextField(default="-->Title here<--")
body = models.TextField(default="-->Body here<--")

# About
user = models.ForeignKey(User)
date = models.DateTimeField(auto_now=True)


object_id = models.PositiveIntegerField(default=0)
content_type = models.ForeignKey(ContentType, default=0)
content_object = fields.GenericForeignKey()

def __str__(self):
return str(self.title)


class Comment(models.Model):
comments = models.ManyToManyField('Comment', blank=True)

# Content
body = models.TextField(default="-->Body here<--")

# About
user = models.ForeignKey(User)
date = models.DateTimeField(auto_now=True)

object_id = models.PositiveIntegerField(default=0)
content_type = models.ForeignKey(ContentType, default=0)
content_object = fields.GenericForeignKey()

def __str__(self):
return str(self.body)

View .py

class PostViewSet(viewsets.ModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer


class CommentViewSet(viewsets.ModelViewSet):
queryset = Comment.objects.all()
serializer_class = CommentSerializer


class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer


def index(request):
return render(request, 'index.html', [])

索引模板是加载最新帖子的“主页”。在每个帖子下,我都会显示评论。在 JSON 中,这些是链接,我发现了如何通过链接加载它们(所以它可以工作)。

有人告诉我,我不应该这样做,而应该让它在后端“加载”评论,并将它们与帖子(数据,而不是链接)一起发送。他让我看一下:http://www.django-rest-framework.org/api-guide/filtering/#overriding-the-initial-queryset

我实在是想不通。

如何获取 ManyToManyField 的数据(插入链接)?

最佳答案

要将所有相关数据展开一层深度,您可以使用深度参数:

class PostSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Post
fields = ['title', 'body', 'comments', 'user', 'date']
depth = 1

这会将 post.userpost.comments id 替换为实际记录。 depth=2 还将展开 post.comments.user。如果您想有选择地仅提取 post.comments 一层深度而不是 post.user:

class PostSerializer(serializers.HyperlinkedModelSerializer):
comments = CommentSerializer(many=True) #has to be declared higher above
class Meta:
model = Post
fields = ['title', 'body', 'comments', 'user', 'date']

如果您希望展开 post.comments.user,则需要将 depth=1 放入现有的评论序列化器中,或者使用展开的用户创建一个新的序列化器仅针对此 View ,与上面的示例类似。

还要确保您在查询集上使用 prefetch_lated ,否则性能会受到严重影响,例如:

Post.objects.all().prefetch_related('comments', 'comments__user')

关于python - Django REST 框架 - 获取数据而不是链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41291411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com