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)