Корректная реализация сериализатора 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 для обновления категорий в отношениях "многие-ко-многим" для связанного вопроса/ответа.