models.py
class Post(models.Model):
content = models.TextField()
created = models.DateTimeField(auto_now_add=True)
suspended = models.BooleanField(default=False)
user = models.ForeignKey(User, on_delete=models.CASCADE)
class Follow(models.Model):
follower = models.ForeignKey(User, related_name='followings', on_delete=models.CASCADE)
following = models.ForeignKey(User, related_name='followers', on_delete=models.CASCADE)
created = models.DateTimeField(auto_now_add=True)
class Meta:
unique_together = ('follower', 'following')
serializer.py
class PostSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class UserSerializer(serializers.ModelSerializer):
is_following = serializers.BooleanField(read_only=True)
views.py
class PostViewSet(ModelViewSet):
serializer_class = PostSerializer
permission_classes = [IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
def get_queryset(self):
queryset = Post.objects.filter(
suspended=False
).select_related(
'user'
)
if self.request.user.is_authenticated:
queryset = queryset.annotate(
user__is_following=Exists(
Follow.objects.filter(
follower=self.request.user,
following=OuterRef("user_id")
)
)
)
else:
queryset = queryset.annotate(
user__is_following=Value(False)
)
return queryset
问题:我无法在用户对象中检查is_following字段。
现象:在我使用嵌套序列化来获取每个帖子中的用户信息的帖子列表中,我无法检查is_following字段。
解决方案:
class PostSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
fields = ('content', 'created', 'suspended', 'user', 'is_following') # 添加'is_following'字段
class UserSerializer(serializers.ModelSerializer):
class Meta:
fields = ('date_joined', 'email', 'first_name', 'id', 'is_active', 'is_following', 'last_name', 'username') # 添加'is_following'字段
class PostViewSet(ModelViewSet):
# ...
def get_queryset(self):
queryset = Post.objects.filter(
suspended=False
).select_related(
'user'
)
if self.request.user.is_authenticated:
queryset = queryset.annotate(
user__is_following=Exists(
Follow.objects.filter(
follower=self.request.user,
following=OuterRef("user_id")
)
)
)
else:
queryset = queryset.annotate(
user__is_following=Value(False)
)
return queryset
def get_username(request):
serializer = UserSerializer(request.user)
return serializer.data['username']
class PostSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
def get_user(self, obj):
serializer = UserSerializer(obj.user)
return serializer.data
class PostViewSet(ModelViewSet):
# ...
def get_queryset(self):
queryset = Post.objects.filter(
suspended=False
).select_related(
'user'
)
if self.request.user.is_authenticated:
queryset = queryset.annotate(
user__is_following=Exists(
Follow.objects.filter(
follower=self.request.user,
following=OuterRef("user_id")
)
)
)
else:
queryset = queryset.annotate(
user__is_following=Value(False)
)
return queryset
评论 (0)