2016-12-05 2 views
1

Я хочу иметь константы экземпляров модели. Упрощенный, это выглядит следующим образом:Константы экземпляра модели Django

class MyModel(models.Model): 
    codename = models.CharField(max_length=50, unique=True) 

constant1 = MyModel.objects.get_or_create(codename="cool") 

Конечно, я не могу сделать это так просто, потому что этот код будет делать попытку поместить данные в базе данных до того, как миграции сделаны, или это не получится, потому что «модели не загружаются» в какой-то момент и т. д. Но я действительно хочу иметь такие константы, потому что я считаю это удобным для импорта.

Очевидное решение проблемы для меня - это сделать функцию, например «def constant1(): ...» или «def get_constant1(): ...», которая будет делать то же самое, но никогда не вызовет никаких проблем на этапе миграции.

Но я хочу, чтобы получить доступ к своему «constant1» как переменной (что-то = constant1), а не как функцию (что-то = constant1())

Пожалуйста, скажите мне, есть ли правильный способ реализации такие константы, или я должен сдаться?

+0

Зачем это нужно делать в одном файле? – user2507

+0

Это не * постоянный *, это было бы - наилучшим образом - хорошо известный объект *, но его все равно вытащили из базы данных. По существу: заполните базу данных с помощью [начальных данных] (https://docs.djangoproject.com/en/1.10/howto/initial-data/) и предоставьте способ запроса для известных объектов. Ваш 'constant1' будет отражать объект так, как это было бы в то время, когда была определена константа, а не в то время, когда вы будете использовать объект ... получайте удовольствие от отладки. – dhke

+0

@ dhke Конечно, я в порядке. Это вполне ожидаемое поведение. – LOMS

ответ

0
I want to have constants of model instances. 

Вы не должны. Ваша модель просто абстрактно определяет вашу схему таблиц/БД, вы бы не хотели, чтобы экземпляры этого содержались в модели, и это не имеет смысла для imo.

Если вы хотите получить конкретный экземпляр модели, как вы отметили, что вы можете сделать функцию, чтобы сделать это:

например (Использование такой же подход)

@classmethod #Edit form comment, no reason not to add it 
def get_instance(cls, **kwargs): 

    return cls.objects.get_or_create(**kwargs) 

Лично я бы даже не делать этого, так как она может иметь непреднамеренные побочные эффекты. Что делать, если вы просто итерационно пытались получить некоторые экземпляры модели (которые вы не должны делать так или иначе ... вы могли бы просто использовать filter и т. Д.), И вы только что создали X новых экземпляров? Если вы пытаетесь получить экземпляр, предположим, что это его существование, и вы, скорее всего, захотите что-то сделать с , что экземпляр, а не какой-то случайно созданный.

+0

Nitpicking: Почему нет '@ classmethod' (если вообще)? – dhke

+0

Вы можете использовать '@ classmethod', чтобы сделать это более абстрактным, передавая в классе и используя' cls.objects. * ', Но не заметили смысла его добавления сюда. Если бы мы хотели, чтобы это было точно, но я просто оставил его, так как я не стал (лично) защищать этот подход в любом случае. – Pythonista

+0

Хм. Мне понадобилось что-то подобное по крайней мере один раз: извлечение известного одноуровневого корневого объекта иерархии (ака ''/''). Объект был создан из прибора, но все же необходимо было его получить. – dhke

Смежные вопросы