Python 为什么';Django休息框架是否显示张贴的纬度?

Python 为什么';Django休息框架是否显示张贴的纬度?,python,django,serialization,django-rest-framework,Python,Django,Serialization,Django Rest Framework,我有一个Django代码库,用于将DB内容提供给前端的API 我现在还希望用户能够通过这个API发布新内容。我有API来接受帖子,但我有一个问题 在我的一个模型中,我有以下字段: from django.contrib.gis.db import models as gis_models class Device(models.Model): geometry = gis_models.PointField(name='geometry', null=True, blank=True)

我有一个Django代码库,用于将DB内容提供给前端的API

我现在还希望用户能够通过这个API发布新内容。我有API来接受帖子,但我有一个问题

在我的一个模型中,我有以下字段:

from django.contrib.gis.db import models as gis_models

class Device(models.Model):
    geometry = gis_models.PointField(name='geometry', null=True, blank=True)
    # And some other fields
我让人们在两个单独的字段(
纬度
经度
)中发布几何体,然后我想将其写入
几何体
字段。我有一个设备序列化器,看起来像这样:

类DeviceSerializer(HALSerializer): types=TypeSerializer(many=True) 经度=序列化程序。SerializerMethodField() 纬度=序列化程序。SerializerMethodField() Organization=serializers.SerializerMethodField()

在我的测试中,我会这样做:

response = self.client.post(
    url,
    data={'types': [], 'latitude': 1, 'longitude': 1, 'organisation': 'abc'},
    format='json'
)
但是
纬度
经度
永远不会显示在
打印(验证数据)
中。有人知道他们为什么不在那里吗?

编辑

下面的解决方案不如其他许多解决方案干净,如本答案中给出的解决方案。我会推荐使用这个,但是如果需要的话,我会把我的留给其他人


问题是您正在发送数据中的
纬度
经度
,但模型只有一个名为geometry的字段。我看到您正试图使用验证数据设置此项,但验证数据是根据模型字段检查的数据,因此您无法在此处获取它。一种解决方法是在视图中添加上下文

如果您的观点是:

class MyView():
    def create(self, request, *args, **kwargs):
        serializer = self.serializer_class(
            data=request.data,
            context={
                "latitude": request.data.get('latitude')
                "longitude": request.data.get('longitude')
            },
        )
        if serializer.is_valid:
            serilazer.save()
然后在序列化程序中,您可以使用

def validate(self, attrs):
    latitude = self.context.get("latitude")
    longitude = self.context.get("longitude")
    attrs.update(
        {
            "geometry": Point(latitude, longitude)
        }
    )
    return super().validate(attrs)

在模型中拼写它为
geometry
,但在序列化程序中拼写它的
geometry
,可能是这样吗?@KathyRindhoops-不,不是这样。这只是一个编辑错误,因为我翻译了一些字段。谢谢你的提醒,我纠正了它。另一个可能的答案是我第一次尝试你的解决方案,但这让我陷入了各种新的麻烦。链接中的解决方案非常完美,而且非常干净。也许你可以把这个链接添加到答案中,这样将来的读者会更加关注它?哦,不是吗
def validate(self, attrs):
    latitude = self.context.get("latitude")
    longitude = self.context.get("longitude")
    attrs.update(
        {
            "geometry": Point(latitude, longitude)
        }
    )
    return super().validate(attrs)