Django外键指向通用Python数据类型?
我正在尝试创建一个Django模型,其中有一个字段可以引用某种Python类型,这种类型可以是整数、字符串、日期或小数。
class MyTag(models.Model):
name = models.CharField(max_length=50)
object = (what goes here??)
我知道如果我想要一个外键指向其他模型,我可以使用GenericForeignKeys和content_types。那么,我该如何创建一个模型字段来引用任何Python类型呢?到目前为止,我想到的唯一办法是创建一些简单的模型来包装这些对象,然后使用GenericForeignKeys。
有没有什么方法可以做到这一点呢?
3 个回答
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)
(免责声明:这是一种变通方法,但可能不是最糟糕的选择)。