#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:
Похоже, что сейчас нет реального способа сделать это правильно, но есть обходной путь, который в основном:
- Удаление поля m2m из пользовательской модели.
- Создание вспомогательной таблицы, называемой что-то вроде
FriendRelationship
с 2Foreign Keys
для модели пользователя. - Получение данных друзей из вспомогательной таблицы.
Это работает, поскольку нет отношений m2m, и данные легко извлекаются.