2009-02-01 5 views
10

우선, 저는 웹 프로그래밍에 관심이 없습니다. 나는 장고에 부딪쳐서 모델에 대해 조금 읽었다. 바로, 파이썬, FIRST_NAME에 대한 이해하여장고 모델 필드는 어떻게 작동합니까?


class Person(models.Model): 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 

    def __str__(self): 
     # Note use of django.utils.encoding.smart_str() here because 
     # first_name and last_name will be unicode strings. 
     return smart_str('%s %s' % (self.first_name, self.last_name)) 

와 클래스 변수는 LAST_NAME 있습니다 : 나는 (djangoproject.com에서) 다음 코드에 흥미를했다? Person.first_name 또는 Person.last_name을 설정하면 모든 Person 인스턴스에 영향을 미칠 것이라고 생각하기 때문에 코드에서 어떻게 사용됩니까? 그런 식으로 사용되는 이유는 무엇입니까?

답변

4

예, first_name 및 last_name은 클래스 변수입니다. 데이터베이스 테이블에서 작성되는 필드를 정의합니다. first_name 열과 last_name 열을 가진 Person 테이블이 있으므로이 테이블에서 클래스 수준에 있어야합니다. http://docs.djangoproject.com/en/dev/topics/db/models/

이 코드에서 사람의 인스턴스에 액세스에 관해서 , 당신은 일반적으로 장고의 ORM을 통해이 일을하고 있으며,이 시점에서 그들은 기본적으로 인스턴스 변수처럼 행동 :

모델에 대한 자세한 내용을 참조하십시오. 모델 인스턴스에 대한 자세한 내용은

, 참조 : http://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs

+0

Danke 숀 앤디에 대한 그래서

! – Geo

+0

여기에 좋은 링크가 있지만 "이 시점에서 그들은 본질적으로 인스턴스 변수로 동작합니다"는 약간의 손 - 흔들림은 실제로 정확하지 않습니다 (또는 적어도 아무것도 설명하지 않습니다). –

+1

충분히 공정한 ... 나는 그 것에 나의 손을 붙들 것이다. 당신의 대답에 +1하십시오. :) –

19

질문의 본질은 어떻게 갑자기에서 (내가 데이터를 할당하는) 인스턴스 변수가 될 (I가 필드 객체를 할당)이 클래스 변수 와서 "입니다 장고의 ORM "? 그 대답은 파이썬 metaclasses의 마법입니다.

메타 클래스를 사용하면 Python 클래스를 만드는 과정에 참여할 수 있습니다 (클래스의 인스턴스 생성, 클래스 자체의 생성이 아님).

Django의 Model 객체 (따라서 하위 클래스 인 모델)는 ModelBase metaclass입니다. 모델의 모든 클래스 속성을 살펴보고 필드 서브 클래스의 인스턴스 인 경우 필드 목록으로 이동합니다. 이 목록은 모델의 클래스 속성 인 _meta 개체의 특성으로 할당됩니다. 따라서 항상 MyModel._meta.fields 또는 MyModel._meta.get_field('field_name')을 통해 실제 Field 개체를 가져올 수 있습니다.

그러면 메서드를 사용하여 모델 인스턴스를 만들 때 초기화 할 인스턴스 특성을 확인할 수 있습니다.

Django 소스 코드를 두려워하지 마십시오. 그것은 훌륭한 교육의 원천입니다! 하지만, 농축을위한

+0

+1 : 이것은 멋진 부두교입니다. 그것은 당신이 깊이 이해해야하는 것이 아닙니다. 그러나 객체가 생성되는 방식에 또 다른 레이어를 추가하여 명백한 인스턴스 변수 규칙을 구부리는 것이 필요합니다. –

+0

좋은 설명. – Harold

+0

차가움. 나는 궁금하다 :'_meta' 속성이 공식 모델 API의 일부인가? – pcv

0

아니 진짜 대답 :

Person.first_name 

p = Person.objects.get(pk=x) 
p.first_name 

이 작동 작동하지 않습니다. 그래서 person의 객체 인스턴스는 이름과 성을 가지고 있지만 정적 컨텍스트 Person은 그렇지 않습니다.

참고 : Django에는 "Person"이 정적 쿼리 세트 작업을 수행 할 수있는 모델 관리자가 있습니다. (https://docs.djangoproject.com/en/dev/topics/db/managers/#managers). 예를

peoples = Person.objects.all()