Django에서 모델 상속의 세 가지 방식

3443 단어 django
다음으로 이동:https://blog.csdn.net/a_9884108/article/details/18815965
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

좋은 웹페이지 즐겨찾기