Сериализация JSON для следующего пользователя
У меня есть файл model.py, как показано ниже.
class User(AbstractUser):
pass
def serialize(self):
return {
"userid" : self.user.id,
"username": self.username
}
def __str__(self):
return f"{self.id} {self.username}"
class Profile(models.Model):
id = models.AutoField(primary_key=True)
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="user_profile")
follower = models.ManyToManyField(User, blank=True, related_name="following")
def __str__(self):
return f"{self.user.username}"
def serialize(self):
return {
"user_id": self.user.id,
"user": self.user.username,
"followers": self.follower.count(),
"followers_usr": [user.username for user in self.follower.all()],
"following": self.user.following.count(),
"following_usr": [user.username for user in self.user.following.all()]
}
Я хочу создать страницу профиля, на которой будет отображаться профиль пользователя, количество подписчиков и подписчиков, а также список пользователей в подписчиках и подписчиках. Я использую возврат JsonResponse
в моем файле views.py.
Все работает хорошо, пока не появится «following_usr».
Я попробовал использовать "following_usr": self.user.following.all()
и получил эту ошибку:
TypeError at /profile/1
Объект типа QuerySet не является JSON сериализуемым
Когда я пытаюсь "following_usr": [user.username for user in self.user.following.all()]
получить эту ошибку:
AttributeError at /profile/1
Объект 'Profile' не имеет атрибута 'username'
Как правильно это сделать?
Ошибка возникает из-за того, что self.user.following.all()
возвращает QuerySet, который не является JSON-сериализуемым.
P.S. Я только сейчас заметил, что происходит на самом деле, думаю, вы можете попробовать следующее:
class Profile(models.Model):
# ... other fields ...
def serialize(self):
return {
"user_id": self.user.id,
"user": self.user.username,
"followers": self.follower.count(),
"followers_usr": [user.username for user in self.follower.all()],
"following": self.user.following.count(),
"following_usr": [self.user.username for user in self.user.following.all()]
}