无法查询“对象”:必须是“用户”实例

时间:2019-04-23 01:53:19

标签: django django-models django-rest-framework

我正在创建具有帖子和关注者的sample-api。帖子应该只对关注者可见

我的 models.py

from django.contrib.auth.models import User

class Post(models.Model):
    creator = models.ForeignKey(User, related_name='creator_post_set', null=True, on_delete=models.CASCADE)
    title = models.CharField(max_length=25)
    created_date = models.DateTimeField(auto_now_add=True)
    content = models.TextField()
    likes = models.BigIntegerField(null=True)
    comments = models.BigIntegerField(null=True)

class Follow(models.Model):
    follower = models.ForeignKey(User, related_name='following', null=True, on_delete=models.CASCADE)
    followed_on = models.DateTimeField(auto_now_add=True)
    following = models.ForeignKey(User, related_name='follower',null=True, on_delete=models.CASCADE) 

我的模型的serializers.py:

class UserSerializer(ModelSerializer):
    password = serializers.CharField(write_only=True)
    def create(self, validated_data):
        user = User.objects.create_user(
            username=validated_data['username'],
            password=validated_data['password'],
            first_name=validated_data['first_name'],
            last_name=validated_data['last_name'],
        )
        return user

    class Meta:
        model = User
        fields = ('password', 'username', 'first_name', 'last_name',)

class PostListSerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['title', 'content', 'created_date',]

 class FollowSerializer(serializers.ModelSerializer):
    class Meta:
        model = Follow
        fields = '__all__'

我的 views.py

    class PostList(generics.ListCreateAPIView):
            serializer_class = PostListSerializer
            follow_model = FollowSerializer.Meta.model
            post_model = PostSerializer.Meta.model

            def get_queryset(self):
                try:
                    followers = self.follow_model.objects.get(follower_id = 
 self.request.user.id) 
                    queryset = self.post_model.objects.get(creator__in = followers)
                except self.follow_model.DoesNotExist:
                    queryset = None
                return queryset

当我调用此视图时,它返回以下错误:

Cannot query "Follow object (1)": Must be "User" instance.

我需要帮助,谢谢。

1 个答案:

答案 0 :(得分:2)

正如我所看到的,Post模型的creator被固定为User模型。因此,您需要使用User模型实例而非Follower模型实例进行查询。

您可以使用以下代码:

following = self.request.user.following.all().values_list('follower', flat=True)  # because of related name
queryset = self.post_model.objects.filter(creator_id__in = list(following))  

在这里,我首先通过self.request.following.all()通过反向关系检索了用户ID。然后,我使用values_list提取了用户ID。之后,我在Post.objects.filter(...)方法中使用了它。