【问题标题】:Django ForeignKey to Generic Python Data Type?Django ForeignKey 到通用 Python 数据类型?
【发布时间】:2011-06-18 03:49:03
【问题描述】:

我正在尝试创建一个 django 模型,它的字段之一是对某种 python 类型的引用,它可以是整数、字符串、日期或小数。

class MyTag(models.Model):
    name = models.CharField(max_length=50)
    object = (what goes here??)

我知道如果我想要任何其他模型的外键,我可以使用 GenericForeignKeys 和 content_types。如何拥有引用任何 python 类型的模型字段?到目前为止,我想出的唯一想法是创建模型,这些模型是对象的简单包装器并使用 GenericForeignKeys。

有什么办法吗?

【问题讨论】:

    标签: python django foreign-keys models


    【解决方案1】:

    由于您想要过滤,您需要为您的字段提供某种数据库支持,而 json 字段对您来说没有那么有价值。您可以使用一些不同的解决方案 根据您的实际需要复杂程度。一个建议是将您的数据序列化为字符串。用足够的零填充字符串/整数/浮点数排序。现在您可以将所有内容过滤为字符串(确保您也填充了您过滤的值)。添加一个 data_type 列来获取正确的 python 对象。

    TYPES = [(int, 1), (Decimal, 2),(date, 3), (str, 4)]
    class MyTag(models.Model):
        name = models.CharField(max_length=50)
        data_type = models.IntegetField(choices=TYPES)
        value = models.CharField(max_length=100)
    
        def set_the_value(self, value):
            choices = dict(TYPES)
            self.data_type = choices[type(value)]
            if self.data_type == int:
                self.value = "%010d" % value
            # else... repeat for other data types
    
        def get_the_value(self):
            choices = dict([(y,x) for x,y in TYPES])
            return choices[self.data_type](self.value)
    

    (免责声明:这是一个 hack,但可能不是最糟糕的)。

    【讨论】:

    • 我最终做了类似的事情。似乎大多数方法都很老套,所以我只为我的每种类型(int、date、str)存储一个字段,它可能是空白的,还有一个我正在使用的枚举标记。
    【解决方案2】:

    JSONField 可以工作,但不能按原样处理Decimal

    【讨论】:

    • 您似乎无法使用此模型轻松进行过滤。例如,如果我想获得一些带有某个nameobject < value 的标签,你能用JSONField 做到这一点吗?我主要存储简单类型,没有字典。
    • 不是直接的,但是没有理智的方法可以为可以存储各种类型的字段定义相对不等式。
    【解决方案3】:

    如果您不需要过滤此字段,您可以使用 JsonField 或者您可以腌制您的对象,例如 this

    第二种方法允许您存储几乎任何类型的 python 数据类型,尽管它只能从 python 代码中使用。

    如果您需要过滤这些数据,您应该只使用一种数据类型创建单独的字段。

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 2018-03-01
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      相关资源
      最近更新 更多