#django #django-rest-framework
#django #django-rest-framework
Вопрос:
У меня есть две модели user и organization. Пользовательская модель является моделью Django по умолчанию. Моя организационная модель выглядит следующим образом
class Organization(models.Model):
name = models.CharField(max_length=254, blank=False)
url = models.URLField(blank=True, null=True)
year = models.PositiveSmallIntegerField(blank=True, null=True)
users = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, through='Membership')
class Meta:
db_table = '"org_organization"'
class Membership(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE,
blank=True,
null=True,
)
organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
position = models.CharField(max_length=254, blank=True, null=True)
is_admin = models.BooleanField(default=False)
class Meta:
db_table = '"org_organization_user"'
Пользователь привязан к одной (или нескольким) организации через Membership
. Я могу получить подробную информацию о пользователе с помощью UserReadSerializer
, которая выглядит следующим образом
класс UserReadSerializer(сериализаторы.ModelSerializer):
password = serializers.CharField(write_only=True)
organization = MembershipSerializer(source='membership_set', many=True)
class Meta:
model = UserModel
fields = ('id', 'email', 'username', 'password', 'first_name', 'last_name', 'organization')
Таким образом, для идентификатора пользователя 1 я получаю следующий ответ:
{
"email": "******@gmail.com",
"first_name": "Hello",
"last_name": "User",
"username": "myuser",
"organization": [
{
"name": "Org1",
"url": "https://org1.net/",
"year": 1893,
"position": "position1",
"is_admin": true
},
{
"name": "Org2",
"url": "https://org2.net/",
"year": 1983,
"position": "position2",
"is_admin": false
}
]
}
Теперь я хочу изменить сведения об организации пользователя, например, позицию с помощью метода PUT, и для этого я передаю данные редактирования в формате, аналогичном:
{
"email": "******@gmail.com",
"first_name": "Hello",
"last_name": "User",
"username": "myuser",
"organization": [
{
"name": "Org1",
"position": "changed_position1",
"is_admin": true
},
{
"name": "Org2",
"position": "changed_position2",
"is_admin": true
}
]
}
Мой сериализатор для этого выглядит следующим образом:
класс UserDetailsSerializer(serializers.Serializer):
username = serializers.CharField(required=True)
first_name = serializers.CharField(required=False)
last_name = serializers.CharField(required=False)
email = serializers.EmailField(required=False)
organization = MembershipSerializer(source='membership_set', many=True, required=False)
Но я не могу получить доступ к organization_name. Все, что я получаю, это поле position
и is_admin
. Есть ли что-то, чего мне здесь не хватает? Я использую Django 1.11. Спасибо за любую помощь!
Комментарии:
1. Я думаю, вам следует прочитать этот документ, Доступные для записи вложенные сериализаторы — DRF
2. Как это
MembershipSerializer
реализовано?