将一个元组保存到Django模型中

4

有没有一种方法将元组保存到Django模型中?

示例:

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

User.location = (longitude, latitude)


2
你希望数据库中的表示是什么?即,你希望使用什么数据类型? - shx2
我不确定我有哪些选项,能否给我一点提示? - mabdrabo
我不知道是否有这样一个功能。你可以创建一个自定义字段,以便在读取/写入时将元组转换为/从单个值(例如其字符串表示)进行转换,或者你可以使用两个字段/数据库列。 - shx2
我已经在使用两个字段的方法了,但是如果有这样的东西存在,它可以为我的模型节省很多字段。 - mabdrabo
1
如果您使用支持GIS的数据库,可以将位置存储在单个字段中。 - Bibhas Debnath
5个回答

9
也许您正在寻找GeoDjango的PointField
from django.contrib.gis.db import models

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

注意:这是针对包含2个数字的元组。 - merhoo
@merhoo 你说得对,这里提供一个例子会更有帮助。我现在不用Django了,你可以测试并添加一个例子吗?我猜代码应该是 user.location = (45, 19) 或者 user.location = Point(45, 19)。 - Norbert Sebők

5

实话说,在 Django 文档中我没有见过 tupleField 这个词。我认为更好的方法是添加两个字段 longitudelatitude,或者创建另一个模型来存储位置信息,在 User 模型中添加 ForeignKey


我已经在使用两个字段的方法,但是如果有这样的解决方案,它可以为我的模型节省很多字段,外键解决方案将占用比所需更多的空间。 - mabdrabo

0
如果您感觉需要将元组保存在单个字段中,那么您应该真正了解关系。这就是它们被创建的原因。
旧答案:
此答案假定您确实正在保存位置。
如果您使用的是PostgreSQL,则可以使用PostGISMySQL和Oracle内置了空间字段。
Django已经支持地理数据。例如 -
from django.contrib.gis.db import models

class ModelName(models.Model):
    centroid = models.GeometryField(blank=True, null=True)

然后,您可以进行各种地理查询(例如,在指定区域内查找地点,并按距离排序等),而您的数据库管理系统将会处理它们。此外,通过这个单一字段,您可以像这样访问数据 -
lat, long = [modelobject.centroid.x, modelobject.centroid.y]
# Or you can just use .x or .y directly

您可以在Geodjango文档中了解更多相关信息。


1
问题在于这不仅仅是位置,事实上在大多数情况下它们都是字符串。 - mabdrabo
抱歉,这个答案没有任何意义。对于字符串,如果您感觉需要在单个字段中保存多个值,则需要更深入地了解关系。在第一范式的数据库规范化的第一个形式中,不应该在单个字段中有多个值。https://en.wikipedia.org/wiki/First_normal_form - Bibhas Debnath

0

我推荐使用Django-Geoposition应用程序,如果需要额外功能,您可以在Google地图中查看纬度和经度。


0

我认为这个答案也可能对此有所帮助。

--

@p14z所建议的那样,保存我的元组最好的方式是使用ArrayField。对于我的示例,我只想保存一个多边形范围,格式如下:(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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接