Хранение пользовательских типов данных в Django

Добавьте это на страницу, которую вы хотите включить только

<?php
if(!defined('MyConst')) {
   die('Direct access not permitted');
}
?>

, затем на страницы, которые включают ее, добавьте

<?php
define('MyConst', TRUE);
?>
0
задан Caboose 6 March 2019 в 16:23
поделиться

1 ответ

Я вижу три варианта решения этой проблемы:

  1. Использовать класс абстрактной модели : Вы можете создать абстрактный базовый класс BBox, который наследует каждый раз, когда вы создать модель. Просто добавьте дополнительные поля к своим подклассам. Таким образом, предполагая, что абстрактный класс BBOXModel:

    class Layer(BBOXModel):
        name = models.CharField(max_length=255, blank=True, null=True)
        title = models.CharField(max_length=255, blank=True, null=True)
        parent_layer = models.ForeignKey('self', blank=True, null=True)
    
    layer = Layer.objects.first()
    layer.min_x  # returns the min_x field
    layer.bbox  # returns the bbox property from `BBOXModel`
    layer.bbox = myBbox  # if you also create a setter for this property
    
  2. Наследование нескольких таблиц также может работать, так что ваши модели наследуются от конкретной модели BBox: автоматически создает отношения один-к-одному. Он также создает одну отдельную таблицу со всеми вашими ограничивающими рамками (так что вы можете запросить ее отдельно), но каждая из них привязана только к одному экземпляру подмодели, который может быть разных типов. Также здесь все свойства и методы родительского класса работают так же, как вы ожидаете от подклассов. Пример кода выше тот же, за исключением того, что теперь у вас есть конкретный BBOXModel, который вы также можете сделать:

    bbox = BBOXModel.objects.first()
    bbox.layer  # works if this bbox "is part of a" Layer, otherwise it will throw an AttributeError
    
  3. Наконец, вы можете создать полностью пользовательский тип поля : он может содержать правильное значение BBOX в ваших моделях: само поле будет иметь значение BBOX, которое у вас уже есть, поэтому, говоря layer.bbox, это будет полный объект Python BBOX, как вы уже привыкли к. Требуется решить, как кодировать BBOX в базе данных. Пример, приведенный в ссылке (раздача карт), может помочь. Лично, если бы я использовал PostgreSQL, я бы использовал JSONField в качестве базового поля базы данных (наследовать от JSONField). Вам, вероятно, нужно будет только определить to_python и get_prep_value, конвертировать в и из JSON и вызывать super(), чтобы позволить JSONField обрабатывать то, как оно представлено в БД. Таким образом, вы сможете определить свой класс следующим образом:

    class Layer(PolymorphicModel):
        name = ...
        ...
        bbox = BBOXField()
    

Со всеми тремя опциями вы можете полностью повторно использовать класс BBOX, который у вас уже есть, путем инкапсуляции обработки из BBOX объектов внутри классов (или поля). В конечном итоге вы сможете просто назначить BBOX экземпляру вашей модели и при извлечении экземпляра модели из базы данных получить его свойство bbox, которое будет возвращать BBOX.

0
ответ дан dirkgroten 6 March 2019 в 16:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: