Django создание промежуточной модели POST - PullRequest
0 голосов
/ 16 марта 2020

Я использую DRM v3.9.4 и имею следующие модели:

class Book(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   ...
   users = models.ManyToManyField("User", related_name="books", through="BookUser")

class BookUser(models.Model):
   user = models.ForeignKey("User", on_delete=models.CASCADE)
   book = models.ForeignKey("Book", on_delete=models.CASCADE)
   permission = models.CharField(...)

class User(models.Model):
   id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
   ...

со следующими сериализаторами:

class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ( "id", ... )

class BookUserSerializer(ModelSerializer):
    class Meta:
        model = BookUser
        fields = ('user', 'permission')

class BookSerializer(ModelSerializer):
    users = BookUserSerializer(source='bookuser_set', many=True)

    class Meta:
        model = Book
        fields = ( "id", "users", ... )
        extra_kwargs = {
            "users": {"allow_empty": True},
        }

При чтении (GET) книги все в порядке :

{
   id: ...,
   users: [
       {
           user: 'some-uuid',
           permission: 'read-only'
       },
       ...
   ]
}

, но при попытке выполнить POST с использованием той же полезной нагрузки:

{
   id: ...,
   users: [
       {
           user: 'some-uuid',
           permission: 'read-only'
       },
       ...
   ]
}

я получаю сообщение об ошибке:

KeyError: 'users'

, глядя на API-руководство ( https://www.django-rest-framework.org/api-guide/relations/) кажется, что по умолчанию вложенные сериализаторы доступны только для чтения, но я не могу заставить его работать.

Кстати, ВАЖНО: все пользователи (и должны) уже существуют поэтому я ожидаю, что этот вызов POST добавит запись в промежуточную таблицу BookUser и, конечно, сам Book, но НЕ будет фактически добавлять новые записи пользователей.

Любая помощь, руководство или помощь была бы признательна, как заставить эту вещь работать

1 Ответ

0 голосов
/ 16 марта 2020

Используя пакет drf-writable-nested, вы можете достичь этого:

from drf_writable_nested import WritableNestedModelSerializer

class BookSerializer(WritableNestedModelSerializer):
    users = BookUserSerializer(source='bookuser_set', many=True)

    class Meta:
       model = Book
       fields = ( "id", "users", ... )
       extra_kwargs = {
          "users": {"allow_empty": True},
       }

DRF Writable nested

...