使用 Django Rest 在多级嵌套序列化器中获取数据

Akh*_*ahu 0 django-rest-framework

需要序列化三个层次嵌套的三个模型。有用户分配的区域,这些区域包含点。用户包含多个区域。区域有多个关联点。用户使用多对多关系链接区域。Areas 在点中使用 Foreign 与点链接。用户可以分配到多个区域。区域可以有多个点。

用户配置文件模型

class UserProfile(AbstractBaseUser,PermissionsMixin):
      phone_number= PhoneNumberField( unique=True)
      name=models.CharField(max_length=255)
      organisation=models.CharField(max_length=255)
      is_active=models.BooleanField(default=True)
      is_staff=models.BooleanField(default=False)
      added_by=models.ForeignKey(settings.AUTH_USER_MODEL,default=1)  
      group = models.ForeignKey('auth.Group', null=True)
      areas=models.ManyToManyField('area.Area',blank=True)
      objects=UserProfileManager()
Run Code Online (Sandbox Code Playgroud)

区域模型

from django.db import models
from django.conf import settings

 # Create your models here.
class Area(models.Model):
      areaName =models.TextField()
      timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
      updated = models.DateTimeField(auto_now=True, auto_now_add=False)
      user = models.ForeignKey(settings.AUTH_USER_MODEL )
      def __str__(self):
         return self.areaName 
Run Code Online (Sandbox Code Playgroud)

点模型

from django.db import models

from django.conf import settings

# Create your models here.
class Point(models.Model):
    name =models.TextField()
    area = models.ForeignKey('area.Area', on_delete=models.CASCADE)
    latitude=models.CharField(max_length=200)
    longitude=models.CharField(max_length=200)
    timestamp=models.DateTimeField(auto_now=False,auto_now_add=True)
    updated=models.DateTimeField(auto_now=True,auto_now_add=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL )
    def __str__(self):
        return self.name 
Run Code Online (Sandbox Code Playgroud)

我想要如下结果:

class UserProfile(AbstractBaseUser,PermissionsMixin):
      phone_number= PhoneNumberField( unique=True)
      name=models.CharField(max_length=255)
      organisation=models.CharField(max_length=255)
      is_active=models.BooleanField(default=True)
      is_staff=models.BooleanField(default=False)
      added_by=models.ForeignKey(settings.AUTH_USER_MODEL,default=1)  
      group = models.ForeignKey('auth.Group', null=True)
      areas=models.ManyToManyField('area.Area',blank=True)
      objects=UserProfileManager()
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经尝试了以下

from django.db import models
from django.conf import settings

 # Create your models here.
class Area(models.Model):
      areaName =models.TextField()
      timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
      updated = models.DateTimeField(auto_now=True, auto_now_add=False)
      user = models.ForeignKey(settings.AUTH_USER_MODEL )
      def __str__(self):
         return self.areaName 
Run Code Online (Sandbox Code Playgroud)
观看次数

from django.db import models

from django.conf import settings

# Create your models here.
class Point(models.Model):
    name =models.TextField()
    area = models.ForeignKey('area.Area', on_delete=models.CASCADE)
    latitude=models.CharField(max_length=200)
    longitude=models.CharField(max_length=200)
    timestamp=models.DateTimeField(auto_now=False,auto_now_add=True)
    updated=models.DateTimeField(auto_now=True,auto_now_add=False)
    user = models.ForeignKey(settings.AUTH_USER_MODEL )
    def __str__(self):
        return self.name 
Run Code Online (Sandbox Code Playgroud)

.py

此代码无法正常工作。我需要对其进行序列化,以便用户包含基于多对多关系的区域。这些区域使用 Point 中的外键链接到 point。

编辑

编辑:区域序列化程序

Akh*_*ahu 5

我已经使用由 AreasSerializer 调用的 LocationSerializer 解决了这个问题。我正在分享代码片段。这很容易。

 
class PointSerializer(serializers.ModelSerializer):
	 class Meta:
	 	model = Point
	 	fields=('id','latitude','longitude')
class AreasLocationSerializer(serializers.ModelSerializer):
	points = PointSerializer(many =True, read_only=True)
	class Meta:
		model=Area
		fields=('id','areaName','points','user')

 
class AreasUserLocationSerializer(serializers.ModelSerializer):
	areas =AreasLocationSerializer(many=True, read_only=True)
	class Meta: 
		model=UserProfile
		fields =('id','phone_number','name','areas')
Run Code Online (Sandbox Code Playgroud)