Как я могу сериализовать вложенное поле m2m в self с помощью django-rest-framework?

#python #django #django-rest-framework

#python #django #django-rest-framework

Вопрос:

У меня есть User модель, которая имеет m2m отношение к самой friends себе, и я пытаюсь сериализовать ее, чтобы увидеть и обновить pk пользователей, которые находятся в отношении.

models.py

 class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField('Email', max_length=254, unique=True)
    name = models.CharField('Full Name', max_length=35, unique=True, null=False, blank=False)

    friends = models.ManyToManyField("User", related_name='user_friends', blank=True)
 

serializers.py

 class UserSerializer(serializers.HyperlinkedModelSerializer):
    password = serializers.CharField( 
        write_only=True,
        required=False,
        help_text='Leave empty if no change needed',
        style={'input_type': 'password', 'placeholder': 'Password'}
    ) #  for setting the password
    
    class Meta:
        model = User
        fields = ('pk', 'email', 'name', 'friends', 'password')

    def create(self, validated_data):
        validated_data['password'] = make_password(validated_data.get('password'))
        return super(UserSerializer, self).create(validated_data)
 

Когда я захожу в свой API, я вижу следующее:

 {
    "user": {
        "pk": 1,
        "email": "user@gmail.com",
        "name": "User",
        "friends": [
            "http://localhost:8000/user_detailAPI/2/"
        ],
    }
}
 

но я бы хотел serializer , чтобы каждое из них отображалось friend в списке следующим образом:

 {
    "user": {
        "pk": 1,
        "email": "user@gmail.com",
        "name": "User",
        "friends": [
            2
        ],
    }
}
 

Кроме того, если бы вы могли сообщить мне, как я мог бы добавить объект в friends поле, используя POST или PUT запрашивая, было бы неплохо, потому что я новичок django-rest-framework , и я чувствую, что это важная проблема.

Комментарии:

1. django-rest-framework.org/api-guide/serializers/…

2. Я действительно ничего не вижу там о сериализации объектов self..

3. какая разница

4. когда я пытаюсь: friends = UserSerializer(many=True) я получаю Unresolved refference сообщение об ошибке

5. Также вы получаете гиперссылки друзей, поскольку используете HyperlinkedModelSerializer вместо ModelSerializer

Ответ №1:

Похоже, что сейчас нет реального способа сделать это правильно, но есть обходной путь, который в основном:

  1. Удаление поля m2m из пользовательской модели.
  2. Создание вспомогательной таблицы, называемой что-то вроде FriendRelationship с 2 Foreign Keys для модели пользователя.
  3. Получение данных друзей из вспомогательной таблицы.

Это работает, поскольку нет отношений m2m, и данные легко извлекаются.