Django外键指向通用Python数据类型?

0 投票
3 回答
863 浏览
提问于 2025-04-16 19:48

我正在尝试创建一个Django模型,其中有一个字段可以引用某种Python类型,这种类型可以是整数、字符串、日期或小数。

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

我知道如果我想要一个外键指向其他模型,我可以使用GenericForeignKeys和content_types。那么,我该如何创建一个模型字段来引用任何Python类型呢?到目前为止,我想到的唯一办法是创建一些简单的模型来包装这些对象,然后使用GenericForeignKeys。

有没有什么方法可以做到这一点呢?

3 个回答

0

如果你不需要对这个字段进行筛选,你可以使用JsonField,或者像这样将你的对象进行序列化(也就是“腌制”)。

第二种方法可以让你存储几乎所有类型的Python数据,不过这种方式只能在Python代码中使用。

如果你需要对这些数据进行筛选,最好是创建单独的字段,每个字段使用一种数据类型。

0

JSONField 可以用,但它不能直接处理 Decimal 类型的数据。

2

因为你想要进行过滤,所以你需要一些数据库的支持,而使用json字段可能对你帮助不大。你可以根据实际需要选择不同复杂程度的解决方案。一个建议是把你的数据转换成字符串。为了方便字符串、整数和浮点数的排序,可以在前面加上足够的零。这样你就可以把所有东西当作字符串来过滤(记得也要给你要过滤的值加上零)。另外,添加一个数据类型的列,以便能获取到正确的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)

(免责声明:这是一种变通方法,但可能不是最糟糕的选择)。

撰写回答