Django 학습의 14: Django ORM 계승 관계

6098 단어
카탈로그
  • Django ORM 상속 관계
  • 1. SINGLE_TABLE(django가 지원하지 않는 것 같음)
  • 2. TABLE_PER_CLASS
  • 3. JOINED
  • 4. 대리 상속

  • 종고 ORM 상속 관계
    참조:https://www.cnblogs.com/holbrook/archive/2012/03/18/2405036.html
    관계 데이터베이스는 표와 표 간의 계승 관계를 나타내는 자연스럽고 효과적인 방법이 없기 때문이다.모델 레이어는 클래스로 표를 나타내고 클래스는 대상을 대상으로 하는 범주이며 계승은 그의 큰 특성이다.당연히 모델클래스를 사용하여 계승을 통해 그들 간의 관계를 나타낼 수 있지만 관계 데이터베이스에 비추려면 어떻게 표시해야 하는가.이것은 데이터베이스 저장의 측면에서 볼 때 소들은 데이터베이스에서 계승 관계를 비추는 몇 가지 방식을 채택했다. 주로 세 가지singletable/table_per_class/joined는 주로python 언어의 동태성 때문에python 클래스는 다중 계승 관계를 할 수 있고 다중 계승 관계의 비주얼도 있다.마지막으로 대리 모델 계승도 있다.
    추상 모델의 정의에 대해 그 내장 클래스에 abstract = True의 metadata를 지정해야 한다. 주의해야 할 것은subclass가 추상 클래스를 계승했지만class meta 내장 클래스의 내용을 계승했다.그러나 일부 내장 클래스의 속성은 계승되지 않습니다. 예를 들어 abstract = True라는 메타데이터는 계승되지 않습니다.즉, subclass를 구축할 때 abstract를 Flase로 설정한다.추상 클래스를 하나의 추상 클래스에서 계승하려면 하위 추상 클래스에 표시된 성명 abstract = True가 필요합니다.같은db테이블도 하위 클래스에 계승되지 않습니다. 하위 클래스는 스스로 설명해야 합니다.
    orm의 계승 가능성과 세 가지 계승 방식의 특징 때문에 하나의 모델이 하나의 데이터베이스 테이블을 비추는 것은 잘못된 것이다.추상적인 모델은 데이터베이스 테이블을 비추지 않습니다.
    1. SINGLE_TABLE(django가 지원하지 않는 것 같음)
    하나의 테이블을 사용하고 데이터베이스에 하나의 맵만 있다. 이 테이블은 전체 계승 트리를 대표한다. 계승 트리의 여러 하위 모델들은 자신이 추가한 필드만 조작하고 전체 계승 트리가 하나의 테이블을 사용하기 때문에 다른 자신이 아닌 필드를 조작할 수 없다.이런 것은 한 표가 모든 필드를 수거하는 것이다. 필드는 군더더기가 없지만 데이터 부류의 데이터 대상은 군더기이다.같은 부모 대상에는 여러 개의 하위 대상이 있다.single_테이블은 모델 레이더에서 부모 클래스와 하위 클래스로 정의합니다
    from django.db import models
    
    class Vehicle(models.Model): #     migration      
        name = models.CharField(max_length=32)
    
        class Meta:
            abstract = True
    
    class Car(Vehicle):
        Color = models.CharField(max_length=32)
    
        class Meta:
            db_table = 'mbook_vehicle'
    
    class Bike(Vehicle):
        Weight = models.IntegerField()
    
        class Meta:
            db_table = 'mbook_vehicle'
        

    2. TABLE_PER_CLASS
    필드가 군더더기가 있습니다. 클래스마다 표가 있습니다. 부류는 추상 클래스입니다. 부류가 비치는 표를 만들지 않고 부류의 필드를 부류가 비치는 표로 복사합니다.
    from django.db import models
    
    class Animal(models.Model):
        name = models.CharField(max_length=32)
    
        class Meta:
            abstract = True
    
    class Dog(Animal):
        Color = models.CharField(max_length=32)
    
    class Bird(Animal):
        Size = models.CharField(max_length=32)

    python 관리자를 사용합니다.py sqlmigrate mbook 0005 보기 sql은 다음과 같습니다.
    BEGIN;
    --
    -- Create model Bird
    --
    CREATE TABLE `mbook_bird` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(32) NOT NULL, `Size` varchar(32) NOT NULL);
    --
    -- Create model Dog
    --
    CREATE TABLE `mbook_dog` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(32) NOT NULL, `Color` varchar(32) NOT NULL);
    COMMIT;
    --         ,          。  name      。

    Animal 클래스는 추상 클래스이기 때문에 Objects 속성, 즉 관리자 관리자가 없기 때문에 데이터 대상을 조작할 수 없고 맵도 만들지 않아 데이터를 조작할 수 없습니다.하위 클래스만 조작할 수 있습니다.
    추상적 계승 조작은 말할 것도 없고 조작 계승의 구체적인 자류만 있으면 된다.이것은 비교적 많이 쓰는 것이다.
    3. JOINED
    군더더기 없이, 모든 종류는 하나의 표이며, 부표와 부표를 동시에 조작해야 한다
    from django.db import models
    
    class Person(models.Model):
        name = models.CharField(max_length=10)
    
    class Man(Person):
        job = models.CharField(max_length=20)
    
    class Woman(Person):
        makeup = models.CharField(max_length=20)

    python 관리자를 사용합니다.py sqlmigrate mbook 0004에서 테이블을 만드는 sql 문장을 볼 수 있습니다
    BEGIN;
    --
    -- Create model Person
    --
    CREATE TABLE `mbook_person` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `name` varchar(32) NOT NULL);  -- id django     
    --
    -- Create model Man
    --
    CREATE TABLE `mbook_man` (`person_ptr_id` integer NOT NULL PRIMARY KEY, `job` varchar(32) NOT NULL);
    --
    -- Create model Woman
    --
    CREATE TABLE `mbook_woman` (`person_ptr_id` integer NOT NULL PRIMARY KEY, `makeup` varchar(32) NOT NULL);
    
    ALTER TABLE `mbook_man` ADD CONSTRAINT `mbook_man_person_ptr_id_9ab049ad_fk_mbook_person_id` FOREIGN KEY (`person_ptr_id`) REFERENCES `mbook_person` (`id`);
    --       
    ALTER TABLE `mbook_woman` ADD CONSTRAINT `mbook_woman_person_ptr_id_67db6679_fk_mbook_person_id` FOREIGN KEY (`person_ptr_id`) REFERENCES `mbook_person` (`id`);
    COMMIT;
    

    이런 것은 하위 클래스에 새 부모 클래스의 필드가 없지만 하위 클래스는 부모 클래스의 필드를 사용할 수 있다. 하위 클래스의 데이터를 만들 때 하위 클래스는 부모 클래스를 계승하기 때문에python-level에서 하위 클래스는 부모 클래스의 필드가 있기 때문에 하위 클래스는 새로운 실례를 만들 수 있다. 하위 클래스는 python-level에서 보면 자신의 테이블에 추가된 것이고 사실은 두 개의 테이블, 즉 하위 클래스가 스스로 비치는 테이블에 조작된 것이다.상속된 부류표에 데이터가 추가되었습니다.그래서 다표상속이라고 하는데 자류와 부류가 비치는 표가 모두 상속에 참여한다.실질적으로 원톤을 추가한 관계입니다.
    다음은 데이터 작업입니다.
    1.   Man    ,  Person      
    >>> m = Man.objects.create(job='programmer')
    mbook_man:
    1   programmer
    mbook_person:
    1   
           ,        name,  person   name.
       ,        ,         ,          。
    2.     Man  ,
    >>> m.delete()
    (2, {'mbook.Man': 1, 'mbook.Person': 1})
                  ;             ,      python                  。
    

    4. 대리 상속
    즉 하나의 모델이 하나의 구체적인 클래스를 계승하지만 하나의 프록시 클래스, 즉 이 계승된 프록시 클래스를 통해 부류를 조작한다. 이 프록시 클래스는class meta에proxy=True의 metadata만 추가하면 된다.프록시 클래스가 나타나는 것은 이런 수요가 있다. 바로 다중 테이블 계승으로 하위 클래스가 테이블을 만들기 때문이다. 현재 요구 사항은 새로운 테이블을 만들고 싶지 않다. 하위 클래스에python-level에 추가된 일부 행위(상위 클래스를 수정할 수 없기 때문에 상위 클래스에 새로운python 차원 행위를 추가할 수 없기 때문이다). 따라서 계승을 통해서만 추가할 수 있지만 하위 클래스에 새로운field 필드가 없는 것이다.새 하위 클래스가 비치는 테이블을 만들 필요도 없습니다.이러한 수요를 바탕으로 대리 계승 모델은 추상적 계승의 반과정(추상적 클래스는 표가 없고 하위 클래스는 구체적인 클래스는 표가 있다)이다. 대리는 부류는 구체적인 클래스이고 대리 계승의 클래스는 표가 없고 python 코드 차원에서만 방법을 추가했고 대리 하위 클래스가 새로운 표를 만들지 않았다.추상과 달리 추상류는 관리자가 없기 때문에 추상류를 통해 데이터베이스의 구체적인 데이터에 접근할 수 없다.프록시 클래스는 다르다. 이것은 관리자가 있고 관리자를 통해 프록시된 부류 구체적인 클래스의 데이터를 조작할 수 있다.
    대리 상속의 장점:
    프록시 모델에서 기본 정렬 설정과 기본 관리자를 변경할 수 있으며 원본 모델에 영향을 주지 않습니다.예를 들어 프록시 클래스가 정렬을 설정하면 프록시 클래스가 데이터를 얻는 것이 정렬의 결과라고 묻는다.구체적인 클래스 부류를 사용하여 데이터를 얻은 비정렬 결과 얻기;이 응용 프로그램은 모델을 바꾸지 않는 상황에서 매우 흔히 볼 수 있다.
    프록시 클래스의 제한 사항:
  • 프록시 모델은 비추상적인 기본 클래스
  • 에서 계승해야 한다.
  • 여러 개의 비추상적인 기류를 계승할 수 없습니다. 이것은 에이전트 모델이 서로 다른 데이터 테이블을 연결할 수 없기 때문입니다
  • 프록시 모델도 임의의 추상적인 기류를 계승할 수 있지만 전제는 모델 필드가 정의되지 않았다는 것이다
  • 에이전트 클래스 관리자
  • 프록시 모델에 관리자를 정의하지 않으면 프록시 모델은 부모 클래스에서 관리자를 계승한다
  • 프록시 모델에 관리자를 정의하면 기본 관리자가 되지만 부모 클래스에 정의된 관리자는 유효합니다
  • 좋은 웹페이지 즐겨찾기