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