У меня есть модель под названием UserProfile
, которая является OneToOneField
по умолчанию User
. У меня есть модель Post
, которая имеет User
как ManyToManyField
. Я не могу написать сериализатор для Post
, который включает в себя ответы User
.Как сериализовать в Django Rest Framework с большим числом полей
Моя UserProfile
модель:
class UserProfile(models.Model):
user = models.OneToOneField(User)
name = models.CharField(max_length=255, null=True)
profile_picture = models.CharField(max_length=1000, null=True)
Моя Post
модель:
class Post(models.Model):
text = models.TextField(null=True)
title = models.CharField(max_length=255, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
user = models.ManyToManyField(User)
Мой Post
сериализатору:
class PostSerializer(serializers.ModelSerializer):
users = UserProfileSerializer(source='user.userprofile', many=True)
class Meta:
model = Post
fields = ('id', 'text', 'title', 'users')
С выше сериализатором я получаю следующее сообщение об ошибке:
Got AttributeError when attempting to get a value for field `users` on serializer `WorkSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `Work` instance.
Original exception text was: 'ManyRelatedManager' object has no attribute 'userprofile'.
EDIT: Я создал еще один сериалайзер UserSerializerForPost
, который используется в PostSerializer
:
class UserSerializerForPost(serializers.ModelSerializer):
user = UserProfileSerializer(source='userprofile')
class Meta:
model = User
fields = ('user',)
class PostSerializer(serializers.ModelSerializer):
users = UserSerializerForPost(source='user', many=True)
class Meta:
model = Post
fields = ('id', 'text', 'title', 'users')
Хотя это работает, но я получаю UserProfile
ответ в словаре user
как users
списка:
"users": [
{
"user": {
"id": 2,
...
},
{
"user": {
"id": 4,
...
}
}
]
Но я хочу:
"users": [
{
"id": 2,
...
},
{
"id": 4,
...
}
}
],
Это потому, что вы определяете поле 'user' в сериализаторе UserSerializerForPost. Удалите это поле. – Gocht
без определения его, как я могу предоставить 'source'? – avi
Вам просто нужно определить модель в вашем мета-классе. – Gocht