使用Django Rest

时间:2019-03-26 07:57:23

标签: django-rest-framework

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

用户个人资料模型

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中的外键链接到Point。

  

编辑

编辑: 区域序列化器

1 个答案:

答案 0 :(得分:1)

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