Только id сохраняется во вложенном сериализаторе django rest framework
У меня есть две модели user и notes, моя цель - получить JSON-ответ, подобный этому.
{
"status": 200,
"data": [
{
"id": 1,
"note": "dd",
"created_on": "2022-10-03T06:58:33.337137Z",
"is_active": true,
"created_by":[{
"username":"loream",
"email":"username@gmail.com",
...........
}
]
},
]}
Модалы - это :
class Notes(models.Model):
note= models.TextField()
created_on=models.DateTimeField(auto_now_add=True)
is_active=models.BooleanField(default=True)
user=models.ForeignKey(UserModal,on_delete=models.CASCADE,null=True,related_name="created_byy",blank=True)
class UserModal(AbstractUser):
username = models.CharField(max_length=30,unique=True)
password = models.CharField(max_length=30)
email = models.EmailField(blank=True)
сериализаторы, которые я написал, это
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = UserModal
fields = '__all__'
class NotesSerializer(serializers.ModelSerializer):
created_byy = UserSerializer(many=True,read_only=True)
class Meta:
model=Notes
fields='__all__'
Но я не смог получить ответ JSON, как ожидалось, я получаю ответы вроде этого
{
"status": 200,
"data": [
{
"id": 1,
"note": "dd",
"created_on": "2022-10-03T06:58:33.337137Z",
"is_active": true,
"user": 1
},
]
}
как я могу достичь ожидаемого результата?
Чтобы исправить это, измените ваш сериализатор следующим образом:
class NotesSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True) # user instead of created_byy, and no many=True
class Meta:
model = Notes
fields = '__all__'
Некоторые пояснения:
.
Проблема у вас в том, что created_byy
не существует в вашей модели Notes
, это имя атрибута для получения набора заметок от экземпляра пользователя.
В принципе, используя user.created_byy.all()
вы получите все заметки, связанные с этим пользователем.
user
- это атрибут, который вы объявили в вашей модели, поэтому вы все еще получаете его при использовании fields='__all__'
, и это определенно тот, который вам нужен.
Если вы действительно хотите, чтобы ваш пользователь имел имя "created_by", просто используйте SerializerMethodField (документация здесь):
class NotesSerializer(serializers.ModelSerializer):
created_by = serializers.SerializerMethodField()
def get_created_by(self, instance):
return UserSerializer(instance.user)
class Meta:
model = Notes
fields = ['id', 'note', 'created_on', 'created_by', 'is_active']
Кроме того, вы не можете иметь массив пользователей в обоих случаях, из-за того, как вы объявили свой one-to-many (один пользователь может иметь несколько записей, обратное неверно).
В заключение, вам действительно следует переименовать created_byy
в notes
, чтобы было меньше путаницы.
@ThomasGth дал вам хорошее объяснение.
Вот быстрое решение от меня
class NotesSerializer(serializers.ModelSerializer):
created_by = UserSerializer(source='user', read_only=True)
class Meta:
model = Notes
fields = ['id', 'note', 'created_on', 'created_by', 'is_active']