2011-06-18 52 views
0

我想創建一個django模型,它有一個字段引用某種類型的python類型,可以是整數,字符串,日期或小數。將Django ForeignKey轉換爲通用Python數據類型?

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

我知道如果我想要任何其他模型的外鍵,我可以使用GenericForeignKeys和content_types。我怎樣纔能有一個模型領域,引用任何python類型?我到目前爲止唯一的想法是創建模型,這些模型是對象的簡單包裝並使用GenericForeignKeys。

有沒有辦法做到這一點?

回答

2

既然你想過濾,你需要某種類型的DB支持你的領域和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) 

(免責聲明:這是一個黑客,但可能不是最差的一個)。

+0

我最終做了類似的事情。看起來大多數方法都很不好,所以我只是爲我的每個類型(int,date,str)存儲一個可能爲空的字段以及我正在使用的枚舉標記。 – jkeesh

0

JSONField會工作,但它不會像原樣那樣處理Decimal

+0

看來你不能很容易地用這個模型過濾。例如,如果我想用某個'name'和'object jkeesh

+0

不是直接的,但沒有理智的方式來定義可以存儲各種類型的字段的相對不等式,無論如何。 –

0

如果您不需要通過此字段篩選您既可以使用JsonField或者你可以醃的對象,如this

第二的aproach將允許你存儲幾乎任何類型的Python數據類型,儘管它只能從python代碼中使用。

如果您需要過濾這些數據,您應該只使用一種數據類型創建單獨的字段。

相關問題