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

标签 python json django serialization django-rest-framework

当前代码

我有两个模型(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/

相关文章:

python - 使用多线程将 AWS Lambda 批量写入 DynamoDB 的执行速度较慢

python - 在 Python 中没有回溯的断言

c# - .NET WCF 服务获取 Blob 的 JSON 列表

python - 针对同一模型原始查询的多个左连接和左连接转换为 Django ORM

python - 创建可裁剪图像字段 - 如何存储小部件的数据?

python - 完全或增量抓取——人们使用什么?

ios - 解析 JSON 问题 - iOS

javascript - 加入 2 个 JSON 对象

python - Django 使用 request.user.get_username() 填充隐藏输入

django - SQLite 数据库推送到 EC2 服务器时出现问题