Корректная реализация сериализатора Django для поля "многие ко многим

У меня есть две модели django, которые связаны полем "многие ко многим":

class Member(models.Model):
  user = models.OneToOneField(to=settings.AUTH_USER_MODEL)
  date_of_birth = models.DateField()
  bio = models.TextField()


class Book(models.Model):
  name = models.CharField(max_length=255)
  author= models.CharField(max_length=255)
  description = models.TextField()
  read_by = models.ManyToManyField(to=Member, related_name='books_read')

Сериализаторами для этих моделей являются:

class MemberSerializer(serializers.Model):
  id = serializers.IntegerField(read_only=True)
  user_id = serializers.IntegerField(read_only=True)
  class Meta:
    model = Member
    fields = ['id', 'user_id', 'date_of_birth', 'bio']


class BookSerializer(serializers.Model):
  id = serializers.IntegerField(read_only=True)
  class Meta:
    model = Book
    fields = ['id', 'name', 'author', 'bio']

Я хочу создать конечную точку, чтобы иметь возможность добавить книгу к участнику. Единственный способ, которым я смог написать сериализатор для этого, был:

class BookIdSerializer(serializers.Model):
  class Meta:
    model = Book
    fields = ['id']

  def update(self, **kwargs):
    # logic to add book with passed id to the authenticated user's member profile

Однако это кажется очень неправильным по двум очевидным причинам:

1 - Существует целый объект сериализатора только для получения идентификатора книги
. 2 - Он даже не является общим, потому что он выполняет очень специфическую функцию добавления книги с переданным идентификатором книги в член

Я уверен, что есть лучший способ сделать это. Пожалуйста, подскажите мне, если вы знаете.

Вы можете использовать PrimaryKeyRelatedField:

class MemberSerializer(serializers.Model):
  id = serializers.IntegerField(read_only=True)
  user_id = serializers.IntegerField(read_only=True)
  books = serializers.PrimaryKeyRelatedField(many=True, queryset=Book.objects.all())
  class Meta:
    model = Member
    fields = ['id', 'user_id', 'date_of_birth', 'bio', 'books']

Это поместит связанные книги в массив, и вы можете редактировать этот массив для добавления и удаления книг, позволяя добавлять или удалять много книг одновременно.

Смотрите Как использовать PrimaryKeyRelatedField для обновления категорий в отношениях "многие-ко-многим" для связанного вопроса/ответа.

Вернуться на верх