#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())