Как создать вложенную сериализацию из множества моделей с помощью django rest framewrok

Я пытаюсь создать вложенные отношения из более чем двух моделей в Django Rest Framework. Заранее благодарю за помощь. У меня получается с двумя моделями, но когда я пытаюсь с тремя моделями, не удается создать вложенную сериализацию.


from django.db import models

class Project(models.Model):
  project_id = models.AutoField(primary_key=True)
  project_name = models.CharField(max_length=255)
  
  def __str__(self):
    return self.name

class Site(models.Model):
  site_id =  models.AutoField(primary_key=True)
  site_name = models.CharField(max_length=255)
  project_id= models.ForeignKey(Project, related_name="projectid", on_delete=models.CASCADE)
  
  def __str__(self):
    return self.site_name 
class Aggin(models.Model):
   assign_id = models.AutoField(primary_key=True)
   site_id = Models.ForeginKey(Site, relate_name="siteid", on_delete=models.CASCADE)
  
from rest_framework import serializers
from .models import Song, Artist


class ProjectSerializer(serializers.ModelSerializer):
    class Meta:
      model = Project
      fields = ('__all__')
      
class SiteSerializer(serializers.ModelSerializer):
  
   
  class Meta:
    model = Site
    fields = ('__all__')

class AggignSerializer(serializers.ModelSerializer)
  class Meta:
     model = Aggin
     fields = ('__all__')

Я думаю, что вам не нужно первичное поле id, если вы хотите использовать стандартную настройку внешнего ключа Django. А related_name должно быть определено из представления модели-контрагента.

from django.db import models

class Project(models.Model):
  project_name = models.CharField(max_length=255)
  
  def __str__(self):
    return self.name

class Site(models.Model):
  site_name = models.CharField(max_length=255)
  project = models.ForeignKey(Project, related_name="sites", on_delete=models.CASCADE)
  
  def __str__(self):
    return self.site_name 

class Aggin(models.Model):
   site = Models.ForeginKey(Site, relate_name="assigns", on_delete=models.CASCADE)

А затем, в сериализаторе, вы можете установить, как показано ниже.

from rest_framework import serializers
from .models import Song, Artist

class ProjectSerializer(serializers.ModelSerializer):
    sites = SiteSerializer(read_only = True, many = True)

    class Meta:
      model = Project
      fields = ('id', 'project_name', 'sites')
      
class SiteSerializer(serializers.ModelSerializer):
    assigns = AggignSerializer(read_only = True, many = True)
   
    class Meta:
        model = Site
        fields = ('id', 'site_name', 'assigns')

class AggignSerializer(serializers.ModelSerializer):

    class Meta:
        model = Aggin
        fields = ('id')

Надеюсь, это может помочь.

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