Добавьте это на страницу, которую вы хотите включить только
<?php
if(!defined('MyConst')) {
die('Direct access not permitted');
}
?>
, затем на страницы, которые включают ее, добавьте
<?php
define('MyConst', TRUE);
?>
Я вижу три варианта решения этой проблемы:
Использовать класс абстрактной модели : Вы можете создать абстрактный базовый класс 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
Наследование нескольких таблиц также может работать, так что ваши модели наследуются от конкретной модели BBox: автоматически создает отношения один-к-одному. Он также создает одну отдельную таблицу со всеми вашими ограничивающими рамками (так что вы можете запросить ее отдельно), но каждая из них привязана только к одному экземпляру подмодели, который может быть разных типов. Также здесь все свойства и методы родительского класса работают так же, как вы ожидаете от подклассов. Пример кода выше тот же, за исключением того, что теперь у вас есть конкретный BBOXModel
, который вы также можете сделать:
bbox = BBOXModel.objects.first()
bbox.layer # works if this bbox "is part of a" Layer, otherwise it will throw an AttributeError
Наконец, вы можете создать полностью пользовательский тип поля : он может содержать правильное значение 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
.