Не удается запросить «объект»: должен быть экземпляр «Пользователя»

#django #django-models #django-rest-framework

#django #django-модели #django-rest-framework

Вопрос:

Я создаю образец 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. можете ли вы добавить полную обратную трассировку?

2. @JPG Я обновил обратную трассировку ошибки

3. это не полная версия traceback …. пожалуйста, добавьте всю обратную трассировку

4. Мне нужен код для ваших сериализаторов, чтобы я мог воспроизвести проблему

5. @HuLuViCa Я также включил сериализаторы

Ответ №1:

Как я вижу, 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() обратное отношение. Затем я извлек идентификаторы пользователей с помощью values_list . После этого я использовал его в Post.objects.filter(...) методе.

Комментарии:

1. Я использовал приведенный выше код, который возвращает post Post matching query does not exist.

2. Возможно, я запрашивал неправильные значения. Не могли бы вы попробовать с valurs_list('follower', flat=True) ?

3. спасибо @ruddra, это работает, несмотря на использование get, я использую filter(Post.bojects.filter())