gpt4 book ai didi

python - Django 使用来自其他模型的信息序列化对象

转载 作者:行者123 更新时间:2023-12-02 03:13:09 25 4
gpt4 key购买 nike

当前代码

我有两个模型(Post 和 View),如下所示。 View 是哪个用户看到了哪个帖子。

后模型:

class Post(models.Model):

creator = models.ForeignKey(User, on_delete = models.CASCADE)
text = models.CharField(max_length = 255)
timestamp = models.DateTimeField(default=now)

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

查看模型:

class View(models.Model):

viewer = models.ForeignKey(User, on_delete = models.CASCADE)
post = models.ForeignKey(Post, on_delete = models.CASCADE)
timestamp = models.DateTimeField(default=now)

def __str__(self):
return str(self.post.pk)

class Meta:
unique_together = ('post', 'viewer')

我的 views.py 目前看起来像这样:

@api_view(['GET'])
@login_required
def get_posts(request):

posts = list(Post.objects.all())
data = serialize('json', posts, use_natural_foreign_keys=True)
return HttpResponse(data, content_type="application/json")

问题

现在我希望能够序列化许多 Post 对象并向每个对象添加一个属性,表明发出请求的用户 (request.user) 是否查看了 Post。

我希望收到的结果示例:

[
{
"model": "posts.post",
"pk": 1,
"fields": {
"creator": ...,
"content": "This is a sample post",
"timestamp": "2019-07-07T19:56:07.220Z",
"viewed_by_user": true <--- I want this attribute
}
},
{
"model": "posts.post",
"pk": 2,
"fields": {
"creator": ...,
"content": "This is another sample post",
"timestamp": "2019-07-10T13:04:19.220Z",
"viewed_by_user": false <--- I want this attribute
}
}
]

我可以用 Django 序列化程序实现吗?我应该以不同的方式构建我的模型吗?

我正在为请求使用 django-rest-framework。您可以问我是否需要任何其他信息来回答我的问题。任何帮助将不胜感激。

最佳答案

您可以使用标准 ModelSerializer来自 DRF:

serializers.py

from rest_framework import serializers

from .models import Post


class PostSerializer(serializers.ModelSerializer):
viewed_by_user = serializers.SerializerMethodField()

class Meta:
model = Post
fields = ('pk', 'creator', 'text', 'timestamp', 'viewed_by_user')

def get_viewed_by_user(self, instance):
user = self.context['request']. user
return instance.view_set.filter(viewer=user).exists()

然后

views.py

from rest_framework.response import Response
...

from .serializers import PostSerializer


@api_view(['GET'])
@login_required
def get_posts(request):
posts = Post.objects.all()
serializer = PostSerializer(posts, many=True, context={'request': request})
return Response(serializer.data)

在您的 View 中,您可以通过提供当前的 request 对象作为序列化程序的上下文来使用新创建的 PostSerializer

之后,您可以受益于SerializerMethodField为了显示 viewed_by_user 属性。

如果您有任何其他问题,请务必在下方发表评论。 :)

关于python - Django 使用来自其他模型的信息序列化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56989250/

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