Django restframework serializer с объединением таблиц
Я создаю django API для бота discord для управления записанными звуками. Вот мои модели (упрощенные) :
class Member(models.Model):
name = models.CharField("Discord Name", max_length=100, unique=True)
discord_id = models.BigIntegerField("Discord ID", unique=True, blank=True, null=True)
class Sound(models.Model):
id = models.AutoField("Sound ID", primary_key=True)
file = models.FileField("Sound", upload_to='sounds/')
added_by = models.ForeignKey(Member, verbose_name="Author", on_delete=models.SET_NULL, blank=True, null=True)
tags = TaggableManager("Tags", blank=True)
class MemberinSound(models.Model):
sound = models.ForeignKey(Sound, on_delete=models.CASCADE, related_name="membersinsound")
personality = models.ForeignKey(Member, related_name='membersinsound', on_delete=models.CASCADE)
Пояснения: звук загружается любым участником (added_by), с несколькими необязательными тегами, и личностью, которая появляется в этом звуке (MemberinSound). Вы можете представить это в виде 3 таблиц (player, match, and playersinmatch).
Мой взгляд на получение определенного звука таков:
class SpecificSound(APIView):
def get(self, request, id: int, formate=None, **kwargs):
sound = Sound.objects.select_related().get(id=id)
membersinsound = sound.membersinsound.all()
serializer = SoundSerializer(sound, many=False)
return Response(serializer.data)
And serializers.py :
class MemberInSoundSerializer(serializers.ModelSerializer):
class Meta:
model = MemberinSound
fields = [
'personality'
]
class SoundSerializer(serializers.ModelSerializer):
personality = MemberInSoundSerializer(many=True, read_only=True)
class Meta:
model = Sound
fields = [
'id',
'title',
'volume',
'file',
'stream_friendly',
'is_active',
'personality',
]
def to_representation(self, instance):
representation = super().to_representation(instance)
representation['path'] = instance.file.path
return representation
Первая проблема, с которой я столкнулся, это в моем представлении, где я отправляю в сериализатор только модель Sound (без MemberinSound), я не нашел, как получить это в одном запросе. Может быть, использовать опции annotate? Думал, что это возможно с помощью чего-то вроде обратных связей, показанных в документации.
Первый раз использую restframework, возможно, я сделал другие ошибки.
Для информации, я использую Django 4.0.3, djangorestframework 3.13.1 и Python 3.8 с SQLITE3.