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.

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