2016-12-05 1 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. 

하지 않아야합니다. 모델은 테이블/DB 스키마를 추상적으로 정의하는 것일 뿐이므로 모델의 인스턴스가 모델에 포함되지 않고 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

관련 문제