Django ForeignKey для общего типа данных Python? - PullRequest
0 голосов
/ 18 июня 2011

Я пытаюсь создать модель django, в которой в качестве одного из полей указана ссылка на какой-то тип python, который может быть целым числом, строкой, датой или десятичным числом.

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

Я знаю, что если мне нужен внешний ключ для любой другой модели, я могу использовать GenericForeignKeys и content_types. Как я могу иметь поле модели, которое ссылается на любой тип Python? Единственная идея, которую я выдвинул на данный момент, - это создание моделей, которые являются простыми обертками для объектов и используют GenericForeignKeys.

Есть ли способ сделать это?

Ответы [ 3 ]

2 голосов
/ 19 июня 2011

Поскольку вы хотите фильтровать, вам понадобится какая-то поддержка БД для вашего поля, и поле 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 голосов
/ 19 июня 2011

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

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

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

0 голосов
/ 18 июня 2011

JSONField будет работать, но не будет обрабатывать Decimal как есть.

...