Django에서 모델 상속의 세 가지 방식
3443 단어 django
Django에서 모델의 계승은 세 가지가 있다. 첫째, 추상 계승 둘째, 다중 표 계승 셋,proxy 모델(프록시 모델)의 첫 번째 추상 계승은 유니버설 부류를 만들고 부류가 만들어지지 않도록 추상 부류의 Meta에 abstract=True를 설정하면 된다.하위 클래스는 상위 클래스와 같은 필드를 계승합니다.
하위 모델 Student에 s 가 있습니다.name, s_age, s_sex 세 필드
class CommonInfo(models.Model):
s_name = models.CharField(max_length=32)
s_age = models.PositiveIntegerField(default=22)
class Meta:
abstract = True
class Student(CommonInfo):
home_group = models.CharField(max_length=32)
내부 연결된 메타 클래스의 계승에 있어 일반적으로 부류의 메타 클래스의 속성은 부류에 계승되고 부류는 자신의 메타에서 부류의 메타를 다시 쓰거나 확대할 수 있다. 확대하면 주로 부류의 메타를 계승한다.
class CommonInfo(models.Model):
...
class Meta:
abstract = True
ordering = ['name']
class Student(CommonInfo):
...
class Meta(CommonInfo.Meta):
db_table = 'student_info'
계승할 때 Django는 기본 클래스의 Meta 내장 클래스를 조정합니다. Meta 속성을 설치하기 전에 Django는 abstract=False를 설정합니다.이것은 추상 기류의 자류가 자동으로 추상류로 변하지 않는다는 것을 의미한다.물론 하나의 추상 클래스가 다른 추상 기본 클래스를 계승할 수 있지만, 매번 abstract=True를 현저하게 설정해야 한다.
추상적인 기본 클래스에 대해 말하자면, 일부 속성은 메타 내장 클래스에 넣는 것은 무의미하다.예를 들어, db 포함테이블은 모든 하위 클래스 (자신을 지정하지 않은 메타 내장 클래스를 가리키는 하위 클래스) 가 같은 데이터베이스 테이블을 사용한다는 것을 의미합니다. 일반적으로 이것은 우리가 원하는 것이 아닙니다.
두 번째 다중 테이블 상속, 그 중에서 부류도 Django 모델이고 데이터 테이블을 만들 것이다. 다중 테이블 상속은 Django의 은밀한 일대일 관계이다.
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()
여기서 MyPerson은 데이터 테이블을 많이 만들지 않았습니다. MyPerson도 Person의 데이터 테이블을 조작했습니다. 일반적으로 우리는 MyPerson을 Person으로 사용할 수 있습니다. 단지dosomething 이 방법은 약간 다르다. 예를 들어
>>> p = Person.objects.create(first_name="foobar")
>>> MyPerson.objects.get(first_name="foobar")
프록시 모델과 원본 모델의 차이점은 다음과 같습니다.
class OrderedPerson(Person):
class Meta:
ordering = ["last_name"]
proxy = True
여기에서 OrderedPerson은 표를 만드는 것이 아니라 대리 정렬 방법입니다.즉, Person의 검색 방법을 사용하여last 를 누르지 않는다는 것이다.name 정렬, OrderedPerson으로 검색한 결과lastname 정렬의OrderedPerson은 Person 클래스와 같은 검색 방법을 사용합니다.
OrderPerson이 되돌아온queryset은 자연히 Person의 것이다. 이것은 당연한 것이다.우리는django가OrderedPerson 클래스의queryset을 되돌려달라고 요구할 수 없습니다. 왜냐하면 OrderedPerson은 에이전트일 뿐이고 실제 데이터베이스 테이블 클래스도 아니기 때문입니다.
주의해야 할 것은proxy 모델은 추상적인 클래스에 계승할 수 없다는 것이다. 이것은 프록시 모델은 조작 연결 데이터베이스이기 때문에 다중 계승할 수 없다. 왜냐하면 네가 다중 계승을 했기 때문에 프록시 모델은 어느 부류에 가서 속성을 찾는지 모른다.
프록시 모델의 관리자를 지정하지 않으면 프록시 모델은 부모 클래스의 관리자를 자동으로 계승합니다.우리도 수동으로 프록시 모델의 관리자를 설정할 수 있다. 그러면 프록시 모델과 부류 모델의 관리자가 분리된다.
프록시 모델에 관리자를 추가하는 방법에는
하나는 프록시 모델에서 관리자를 직접 지정하는 것이다
class NewManager(models.Manager):
...
class MyPerson(Person):
objects = NewManager()
class Meta:
proxy = True
다른 하나는 부모 모델의 관리자를 덮어쓰고 싶지 않지만 추가 관리자를 추가하고 싶다면 추상 모델을 새로 만들고 관리자를 정의한 다음에 이 추상 모델을 계승할 수 있다. 예를 들어 다음과 같다.
# Create an abstract class for the new manager.
class ExtraManagers(models.Model):
secondary = NewManager()
class Meta:
abstract = True
class MyPerson(Person, ExtraManagers):
class Meta:
proxy = True
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.