【发布时间】:2019-07-11 11:43:20
【问题描述】:
这个问题可能看起来多余,但我已经搜索了其他答案,但他们似乎没有解决问题。我正在使用带有 DRF3 的 GeoDjango。我的模型中有一个名为 location 的字段,其值作为 Point 实例给出,它以经度和纬度作为参数。
因此,在序列化程序中,我有两个非模型字段 - 纬度和经度。但是,当我打印 validated_data 时,lat 和 lng 并没有反序列化。
更新
我已经删除了 latitude 和 longitude 的 serialzerMethodField 并用 location 字段替换它们,就像我在我的模型中一样。
models.py
class Site(models.Model):
site_id = models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True)
owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="site")
location = models.PointField(geography=True, null=True, blank=True)
area = models.FloatField(null=True)
objects = SiteManager()
managers.py
class SiteManager(BaseManager):
use_in_migrations = True
def create(self, owner, **kwargs):
print('kwargs is ',kwargs)
site = self.model(
owner = owner,
area = kwargs['area'],
location=Point(float(kwargs['location']['latitude']), float(kwargs['location']['longitude'])),
)
site.save(using=self._db)
print('site is ',site)
return site
序列化器.py
class SiteSerializer(serializers.ModelSerializer):
class Meta:
model = Site
fields = ('location', 'area')
# Serializer to get user details
class UserSiteSerializer(serializers.ModelSerializer):
site = SiteSerializer()
class Meta:
model = User
fields = ('fullName', 'email', 'site')
def create(self, validated_data):
site_data = validated_data.pop('site')
user = InterestedUser.objects.create(**validated_data)
Site.objects.create(owner=user, **site_data)
return user
请求数据为:{'fullName': 'rtyhgf', 'email': '8sdfggfs@er.com', 'site': {'location': {'longitude': 72.81919139881033, 'latitude': 18.925400020910235}, 'area': 636.865234375}
当我在UserSiteSerializer 的create 方法中打印site_data 时,我得到OrderedDict([('area', 636.865234375)])
【问题讨论】:
-
return validated_data['latitude']而不是print(validated_data['latitude'])? -
@waynetech 我试过了,但没用。目前,我正在尝试删除
serializerMethod字段并将其替换为fields中的位置。在repr中,它给了我modelField的字段。但是,现在我收到了AttributeError: 'RelatedManager' object has no attribute 'location'
标签: django django-rest-framework geodjango