Django Rest Framework как сериализовать реляционную модель "многие ко многим"?

Я делаю проект на Django Rest Framework. Сейчас я пытаюсь сериализовать отношения многие ко многим, но я не знаю, как это работает. Вот код моих моделей:

Модель для файлов

def user_directory_path(instance, filename):
    return 'user_{0}/{1}'.format(instance.user.id, filename)


class Document(models.Model):
    name = models.CharField(max_length=250, blank=True, null=True)
    document = models.FileField(upload_to=user_directory_path)

    def __str__(self):
        return self.name

Модель для расходов и кредитов

class Expenses(models.Model):
    name = models.CharField(max_length=250, blank=True, null=True)
    amount = models.DecimalField(default=0.0, decimal_places=2, max_digits=10)
    date = models.DateField(auto_now=True)
    additional_files = models.ManyToManyField(Document, blank=True, related_name="expenses")  # Upload multiple files

    def __str__(self):
        return self.name


class Loans(models.Model):
    name = models.CharField(max_length=250, blank=True, null=True)
    amount = models.DecimalField(default=0.0, decimal_places=2, max_digits=10)
    loan_from = models.CharField(max_length=250, blank=True, null=True)
    date = models.DateField(auto_now=True)
    additional_files = models.ManyToManyField(Document, blank=True, related_name="loans")  # Upload multiple files

    def __str__(self):
        return self.name

Мой вопрос: Просто хочу знать, как сериализовать эти additional_files в Расходах и Кредитах.

  • Будет намного лучше, если вы дадите ресурсы и объяснения, как это работает.

Для конечной точки List можно сделать что-то вроде этого:

serializers.py

class ListDocumentSerializer(serializers.Serializer):   
    # Document fields


class ListLoansSerializer(serializers.Serializer):
    name = serializers.CharField()
    additional_files = ListDocumentSerializer(many=True)
    # other loans model fields

views.py

class ListLoansApi(APIView):

    permission_classes = []    
   
    def get(self, request):

        loans = Loans.objects.prefetch_related('additional_files') # prefetch_related for ORM optimization with M2M 

        loans_data = ListDoctorSerializer(loans, many=True).data

        return Response(loans_data)
Вернуться на верх