2011-06-18 1 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

Поскольку вы хотите фильтровать, вам понадобится какая-то поддержка БД для вашего поля, а поле json не будет для вас ценным. Вы можете использовать какое-то другое решение с различными уровнями сложности в соответствии с вашими настоящими потребностями. Одно из предложений - сериализовать ваши данные в строку. Pad с достаточным количеством нулей для сортировки по строкам/целым числам/поплавкам. Теперь вы можете отфильтровать все ваши данные как строку (убедитесь, что вы также накладываете значение, которое вы фильтруете, также). Добавьте столбец 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

Похоже, что вы не сможете очень легко фильтровать эту модель. Например, если бы я хотел получить некоторый тег с определенным именем и именем объекта, вы могли бы сделать это с помощью JSONField? Я в основном храню простые типы и словари. – jkeesh

+0

Не напрямую, но нет разумного способа определить относительные неравенства для поля, которое может хранить различные типы независимо. –

0

Если вам не нужно фильтровать через это поле можно либо использовать JsonField или вы можете законсервировать свои объекты как this

Второй Подход позволит вам хранить практически любой тип типа питона данных, хотя это будет использоваться только из кода python.

Если вам необходимо отфильтровать эти данные, вы должны просто создать отдельные поля с одним типом данных.