【问题标题】:Testing django geoodel with PointField results in TypeError使用 PointField 测试 django geoodel 导致 TypeError
【发布时间】:2021-09-16 06:47:28
【问题描述】:

我有以下型号:

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

class UserAddress(geo_model.Model):
    user = geo_model.OneToOneField(
        User, on_delete=models.CASCADE, related_name="user_address"
    )
    coordinates = geo_model.PointField()
    address = geo_model.CharField(max_length=255)
    city = geo_model.CharField(max_length=20)
    country = geo_model.CharField(max_length=20)

    def __str__(self):
        return self.name

现在,我正在尝试使用 pytest 对该模型进行单元测试:

@pytest.mark.django_db
class test_user_address():
    user_address = UserAddress(
        user=User(),
        address="my address",
        city="Oran",
        country="Algeria",
        coordinates=(7.15, 35.0)
    )
    user_address.save()

但是,这会导致以下错误:

TypeError: Cannot set SeekerAddress SpatialProxy (POINT) with value of type: <class 'tuple'>

我应该如何在坐标中传递数据类型?

【问题讨论】:

    标签: python django postgresql gis geodjango


    【解决方案1】:

    您需要使用django.contrib.gis.geos Point 的实例。

    所以你的测试的正确代码是:

    coordinates=Point(7.15, 35.0) # you can use tuple if you prefer but it's not mandatory
    

    【讨论】:

    • 谢谢你,我刚刚找到了答案,我虽然 PointField 会接受一个元组并将其转换为一个点
    • 欢迎您,事实上您的想法可能是一个有趣的功能请求。
    • 是的,我认为如果我从前端获取一个元组并将其直接放入我的序列化程序以进入 PointField 会更方便。这样更直接明了。
    【解决方案2】:

    所以我找到了一个临时解决方案,我应该使用Point 而不是tuple。我认为PointField 会接受一个元组并将其转换为Point。

    基本上,这就是我所做的:

    @pytest.mark.django_db
    def test_user_address():
        user= User()
        user.save()
        user_address = UserAddress(
            user=user,
            address="my address",
            city="Oran",
            country="Algeria",
            coordinates=Point(7.15, 35.0)
        )
        user_address.save()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-03
      • 2014-08-16
      • 2011-12-11
      • 2016-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多