【问题标题】:GeoDjango saving empty fieldsGeoDjango 保存空字段
【发布时间】:2021-08-25 09:02:45
【问题描述】:

好的,为什么我不能将空值保存到 Point-、MultiPoint- 或 PolygonField?

我创建了一个表单,用户可以在其中选择他们发现特定鸟类的区域或位置。我使用 GeoDjango 来存储数据,数据可以存储在 PointField 或 PolygonField 中。

PointField 不是必需的,所以在我设置为 False 的表单中,这给了我以下错误;

为了记录,我使用 MySQL 作为数据库。我目前不需要 PostgreSQL 附带的所有额外功能。

IntegrityError at /sighting/where-did-you-spot-the-bird/

(1048, "Column 'sighting' cannot be null")

#models.py

from django.contrib.gis.db import models

class Sighting(models.Model)
    name = models.CharField(max_length=140)
    description = models.TextField()
    sighting = models.PointField(
        blank=True,
        null=True,
        spatial_index=False
    )

所以列瞄准不能为空,这是为什么呢?我是遗漏了什么还是总是需要一个值?

一种解决方案是保存一个默认值,假设是 Point(0,0),但它们应该是另一种解决方案。

任何想法将不胜感激!

【问题讨论】:

    标签: mysql django geodjango


    【解决方案1】:

    MySQL 不允许空空间字段(已知陷阱:https://www.buzzphp.com/posts/geodjango-mysql-points-cant-be-null-what-other-empty-value-should-i-use

    添加一个空的Point()default 或一个带有纬度/经度的点0,0

    class Sighting(models.Model)
        sighting = models.PointField(
            blank=True,
            spatial_index=False,
            default=Point(0, 0)  # or Point([]) if allowed
    )
    

    或者考虑使用 PostGIS 更改为 PostgresSQL:当我们使用 GIS 时,几乎按照定义,我们将使用大数据,而 PostgreSQL 更适合该角色。 (示例文章:https://www.enterprisedb.com/blog/postgresql-vs-mysql-360-degree-comparison-syntax-performance-scalability-and-features

    【讨论】:

    • 好吧,我知道他们使用 MySQL 的功能有限,比如无法设置自定义 SRID,但我不知道它不允许空空间字段。我目前正在使用默认点,稍后将过滤掉它。感谢您的澄清!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 2016-04-29
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多