Django 序列化程序中的反向外键
Reverse Foriegn Key in Django Serializers
假设
class Post(models.Model):
content = ...
image = ...
timestamp = ...
class PostLike(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,...)
post = models.ForiegnKey(Post,...)
timestamp = ...
和
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ("content","image","timestamp","liked")
这里喜欢可以是真也可以是假。
如果用户 (request.user) 在 PostLike 中,则为真。
如何创建喜欢的字段?
查看
@login_required()
def AllPosts(request):
obj = Posts.objects.all()
serializer = PostSerializer(obj, many=True)
result = JsonResponse(serializer.data, safe=False)
return result
您的序列化程序已经有一个 liked
属性的字段,唯一缺少的是一个字段:
class PostSerializer(serializers.ModelSerializer):
liked = <strong>serializers.BooleanField(read_only=True)</strong>
class Meta:
model = Post
fields = ('content', 'image', 'timestamp', 'liked')
您需要的是 QuerySet
,其中的帖子具有额外的属性 .liked
您可以使用额外的属性来注释 Post
对象,该属性指定对象是否被点赞:
from django.db.models import Exists, OuterRef
def @login_required
def AllPosts(request):
obj = Posts.objects.get_queryset(*args, **kwargs).annotate(
liked=Exists(
<strong>PostLike.objects.filter(user=request.user, post_id=OuterRef('pk')</strong>)
)
)
serializer = PostSerializer(obj, many=True)
result = JsonResponse(serializer.data, safe=False)
return result
假设
class Post(models.Model):
content = ...
image = ...
timestamp = ...
class PostLike(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL,...)
post = models.ForiegnKey(Post,...)
timestamp = ...
和
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ("content","image","timestamp","liked")
这里喜欢可以是真也可以是假。 如果用户 (request.user) 在 PostLike 中,则为真。
如何创建喜欢的字段?
查看
@login_required()
def AllPosts(request):
obj = Posts.objects.all()
serializer = PostSerializer(obj, many=True)
result = JsonResponse(serializer.data, safe=False)
return result
您的序列化程序已经有一个 liked
属性的字段,唯一缺少的是一个字段:
class PostSerializer(serializers.ModelSerializer):
liked = <strong>serializers.BooleanField(read_only=True)</strong>
class Meta:
model = Post
fields = ('content', 'image', 'timestamp', 'liked')
您需要的是 QuerySet
,其中的帖子具有额外的属性 .liked
您可以使用额外的属性来注释 Post
对象,该属性指定对象是否被点赞:
from django.db.models import Exists, OuterRef
def @login_required
def AllPosts(request):
obj = Posts.objects.get_queryset(*args, **kwargs).annotate(
liked=Exists(
<strong>PostLike.objects.filter(user=request.user, post_id=OuterRef('pk')</strong>)
)
)
serializer = PostSerializer(obj, many=True)
result = JsonResponse(serializer.data, safe=False)
return result