Django Rest Framework objects.get выдает, что запрос не существует, но фильтр показывает, что элемент существует
У меня есть модель поста:
class Post(models.Model):
category = models.ForeignKey(Category, on_delete=models.SET_DEFAULT, default=1)
body = models.TextField("content", blank=True, null=True, max_length=5000)
slug = AutoSlugField(populate_from=["category", "created_at"])
video = models.FileField(upload_to=video_directory_path, null=True, blank=True)
user = models.ForeignKey(
User, on_delete=models.CASCADE, verbose_name="user", related_name="user"
)
published = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
verbose_name = "post"
verbose_name_plural = "posts"
db_table = "posts"
ordering = ["created_at"]
get_latest_by = "created_at"
def __str__(self):
return self.body[0:30]
def get_absolute_url(self):
return self.slug
def one_image(self):
return PostImage.objects.all().filter(post=self)[:1]
и у меня есть эта модель оценки сообщения, чтобы кто-то мог оценить сообщение:
class PostRating(models.Model):
post = models.ForeignKey(Post, on_delete=models.CASCADE)
score = models.IntegerField(choices=list(zip(range(1, 6), range(1, 6))))
user = models.ForeignKey(
User, on_delete=models.CASCADE, verbose_name="user that gave rating"
)
created_at = models.DateTimeField(auto_now_add=True, verbose_name="created at")
updated_at = models.DateTimeField(auto_now=True, verbose_name="updated at")
class Meta:
verbose_name = "rating"
verbose_name_plural = "ratings"
db_table = "post_ratings"
def __str__(self):
return str(self.score)
Я пытаюсь получить рейтинг поста вместе с постом в конечной точке. Вот сериализаторы, которые я использую для достижения этой цели:
class UserPostSerializer(serializers.ModelSerializer):
images = PostImageSerializer(many=True, read_only=True, required=False)
profile = serializers.SerializerMethodField()
bookmarked = serializers.SerializerMethodField()
rating = serializers.SerializerMethodField()
class Meta:
model = Post
fields = [
"id",
"category",
"body",
"images",
"video",
"profile",
"published",
"bookmarked",
"rating",
"created_at",
"updated_at",
]
depth=1
def get_profile(self, obj):
profile_obj = Profile.objects.get(id=obj.user.profile.id)
profile = ShortProfileSerializer(profile_obj)
return profile.data
def get_bookmarked(self, obj):
loggeduser = self.context.get('view').kwargs.get('user')
bookmark = Bookmark.objects.filter(owner=loggeduser, post=obj.id, marktype='post')
if bookmark:
return True
else:
return False
def get_rating(self, obj):
rating_obj = PostRating.objects.filter(post=obj.id)
if rating_obj:
rating = PostRatingSerializer(rating_obj)
return rating.data
class PostRatingSerializer(serializers.ModelSerializer):
class Meta:
model = PostRating
fields = [
"post",
"score",
"user",
]
В функции get_rating если я сделаю точку останова после:
rating_obj = PostRating.objects.filter(post=obj.id)
тогда я вижу объект, но получаю ошибку в браузере:
Got AttributeError when attempting to get a value for field `post` on serializer `PostRatingSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `QuerySet` instance.
Original exception text was: 'QuerySet' object has no attribute 'post'.
Если я меняю фильтр на get, то получаю ошибку в браузере:
PostRating matching query does not exist.
Почему get говорит мне, что объект не существует, когда filter ясно показывает, что он существует. Во-вторых, почему я получаю ошибку о неправильном сериализаторе, если я использую filter. Я использую filter в том случае, если у поста еще нет рейтинга.
Что я делаю неправильно и как я могу получить рейтинг сообщения в сериализаторе сообщений?