сериализация данных из нескольких таблиц в drf

#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 реализовано?