Как использовать поле ManyToMany в JsonResponse?
У меня есть такая модель в Django:
class Post(models.Model):
poster = models.ForeignKey('User', on_delete=models.CASCADE, related_name='posts')
body = models.TextField()
timestamp = models.DateTimeField(auto_now_add=True)
likers = models.ManyToManyField('User', blank=True, null=True, related_name='liked_posts')
likes = models.IntegerField(default=0)
def serialize(self):
return {
'id': self.pk,
'poster': self.poster.username,
'body': self.body,
'timestamp': self.timestamp.strftime('%b %d %Y, %I:%M %p'),
'likes': self.likes
}
Он работает, но когда я пытаюсь добавить к нему likers, я получаю ошибку, которая говорит, что я не могу использовать много полей. Как я могу сделать такую вещь?
Я получаю его в JavaScript следующим образом:
fetch('/posts')
.then(response => response.json())
.then(data => {
console.log(data);
});
Используя этот вид:
def posts_view(request):
posts = Post.objects.all()
posts = posts.order_by('-timestamp').all()
return JsonResponse([post.serialize() for post in posts], safe=False)
Вам не нужно сериализовать модели вручную, т.е. определять serialize(self) метод для каждой модели. Попробуйте использовать django-rest-framework, все уже сделано за вас.
- Определите сериализаторы для ваших моделей в
serializers.py.
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = "__all__"
class PostSerializer(serializers.ModelSerializer):
poster = UserSerializer()
likers = UserSerializer(many=True, allow_null=True, default=None)
# if you want short info about likers (list of ids), use snippet below
# likers = serializers.PrimaryKeyRelatedField(queryset=User.objects.all(), many=True)
class Meta:
model = Post
fields = "__all__"
- А затем, по вашему мнению:
def posts_view(request):
posts = Post.objects.all().order_by('-timestamp')
data = PostSerializer(posts, many=True).data
return JsonResponse(data)