【问题标题】:save a tuple to a django model将元组保存到 django 模型
【发布时间】:2014-01-07 18:52:32
【问题描述】:

有没有办法将元组保存到 django 模型中?

示例:

Class User(models.Model):
  location = models.tupleField()

在哪里User.location = (longitude, latitude)

【问题讨论】:

  • 您希望数据库中的表示形式是什么? IE。什么数据类型?
  • 我不确定我有哪些选项,请给我一个提示。
  • 我不知道有一个。您可以创建一个自定义字段,在读取/写入时将元组从/转换为单个值(例如其字符串表示),或者您使用两个字段/DB-columns。
  • 我已经在使用两个字段的方法,但我认为如果存在这样的东西,它会在我的模型中节省很多字段
  • 如果您使用启用了 GIS 的数据库,您可以将位置存储在单个字段中。

标签: python django django-models tuples


【解决方案1】:

也许你正在寻找GeoDjango's PointField

from django.contrib.gis.db import models

Class User(models.Model):
    location = models.PointField(help_text="Represented as (longitude, latitude)”)

【讨论】:

    【解决方案2】:

    老实说,我没有在 django 文档中看到 tupleField。我认为更好的方法是添加两个字段 longitudelatitude 或创建另一个模型来存储位置并在 User 模型中添加 ForeignKey

    【讨论】:

    • 我已经在使用两个字段的方法,但我认为如果存在这样的东西,它会在我的模型中节省很多字段,foreignKey 解决方案将占用比需要更多的空间
    【解决方案3】:

    如果您觉得需要将元组保存在单个字段中,您应该真正研究关系。这就是它们被创建的原因。

    旧答案:

    这个答案是假设你真的在保存位置。

    如果您使用的是 PostgreSQL,则可以使用 PostGISMySQL 和 Oracle 内置了空间字段。

    Django 已经支持地理数据。例如。 -

    from django.contrib.gis.db import models
    
    class ModelName(models.Model):
        centroid = models.GeometryField(blank=True, null=True)
    

    然后您可以进行各种地理查询(例如查找指定区域内的地点、按距离排序等),您的 DBMS 会处理它们。再加上从那个单一的领域,你可以访问你的数据 -

    lat, long = [modelobject.centroid.x, modelobject.centroid.y]
    # Or you can just use .x or .y directly
    

    您可以在Geodjango documentation 中阅读有关它们的更多信息。

    【讨论】:

    • 问题不仅是位置,事实上大多数情况下它们都是字符串
    • 对不起,那么这个答案没有任何意义。对于字符串,如果您觉得需要在单个字段中保存多个值,则需要更深入地研究关系。在数据库规范化的第一种形式中,单个字段中没有多个值。 en.wikipedia.org/wiki/First_normal_form
    【解决方案4】:

    我推荐Django-Geoposition 应用程序,此外,您可以在谷歌地图中查看纬度和经度。

    【讨论】:

      【解决方案5】:

      我认为this answer 在这里也可以提供帮助。

      --

      正如@p14z 建议的那样,保存我的tuple 的最佳方法是ArrayField。对于我的示例,我只想保存一个多边形 extent,格式如下:

      (3.7739613717694787, 50.31527681737183, 4.726162032377, 50.49743217278623)

      from django.contrib.postgres.fields import ArrayField
      my_tuple_field = ArrayField(models.FloatField(), size=4, null=True)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多