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



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

用户配置文件模型

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()

区域模型

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 

点模型

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 

我想要如下结果:

   {
        "id": 3,
        "phone_number": "+919999999999",
        "name": "Ak",
        "organisation": "sp",
        "group": 1,
        "areas": [
            {
                "id": 1,
                "areaName": "Area 51",
                "user": 1
                points:[{
                }]
            },
            {
                "id": 2,
                "areaName": "Rrea 343",
                "user": 1
                point:[{}]
            }
        ]
    },
    {
        "id": 4,
        "phone_number": "+918888888888",
        "name": "Chitra Sahu",
        "organisation": "sd",
        "group": 2,
        "areas": [
            {
                "id": 1,
                "areaName": "Area 51",
                "user": 1
                point:[{
                     
                    latitude:'23.2323',
                  longitude:'23.2323'
                },
                {
                   
                    latitude:'21.1223',
                  longitude:'32.34345'
                }
                ]
            },
            {
                "id": 2,
                "areaName": "Rrea 343",
                "user": 1
                point:[{
                     
                    latitude:'23.2323',
                  longitude:'23.2323'
                },
                {
                   
                    latitude:'21.1223',
                  longitude:'32.34345'
                }]
            }
        ]
    },

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

class AreasSerializer(serializers.ModelSerializer):
class Meta:
	model=Area
	fields=('id','areaName','user')
class AreasUserSerializer(serializers.ModelSerializer):
	areas = AreasSerializer(many=True, read_only=True)
	class Meta:
		model = UserProfile
		fields = ('id','phone_number','name','organisation','group','areas')
class AreasUserPointSerializer(serializers.ModelSerializer):
	areasUsers=AreasUserSerializer()
	class Meta: 
		model=Point
	fields =('id','areasUsers' )
视图

'''Fetch list all question '''
class AreasPointsUsersListApiView(ListAPIView):
	
	
	serializer_class=serializers.AreasUserPointSerializer
	def get_queryset(self):
		queryset=UserProfile.objects.all()
		user=self.request.query_params.get('user_id',None)
		if user is not None:
			queryset = queryset.filter(id=user)
		#if areas is not None:
		#	queryset = queryset.filter(areas=areas)
		return queryset

。.py

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

编辑

编辑:区域序列化程序

我已经使用由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')

最新更新