Только 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']
Вернуться на верх