Django ForeignKey到通用Python数据类型?

时间:2011-06-18 03:49:03

标签: python django foreign-keys models

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

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

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

有没有办法做到这一点?

3 个答案:

答案 0 :(得分:2)

由于你想要过滤,你需要为你的字段提供某种数据库支持,而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)

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

答案 1 :(得分:0)

JSONField可行,但不会按原样处理Decimal

答案 2 :(得分:0)

如果您不需要在此字段中进行过滤,则可以使用JsonField,也可以像this

那样挑选对象

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

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