Django contenttypes 프레임 상세 설명(소결)

5414 단어 Djangocontenttypes
1.Django ContentTypes 는 무엇 입 니까?
Django ContentTypes 는 Django 프레임 워 크 가 제공 하 는 핵심 기능 으로 현재 프로젝트 의 모든 Django 기반 model 에 더욱 높 은 차원 의 추상 적 인 인 터 페 이 스 를 제공 합 니 다.물론 http 의 content-type 을 말 하 는 것 은 아 닙 니 다!전혀 상관 없어!
Django ContentTypes 가 Django 프레임 워 크 에서 무엇 을 했 는 지,Django ContentTypes 를 어떻게 사용 하 는 지 설명 하 겠 습 니 다. 
물론 ContentTypes 에 대해 초보적인 이 해 를 가지 고 응용 장면 만 모 르 면 원본 문 서 를 직접 찾 아 볼 수 있 습 니 다.
https://docs.djangoproject.com/en/1.10/ref/contrib/contenttypes/
2.Django ContentTypes 는 무엇 을 했 습 니까?
django-admin 을 사용 하여 django 프로젝트 를 초기 화 할 때 기본 INSTALL 을 볼 수 있 습 니 다.APPS 에는 django.contrib.contenttypes 가 포함 되 어 있 습 니 다.

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
]
또한 django.contrib.contenttypes 는 django.contrib.auth 이후 auth 의 permission 시스템 이 contenttypes 에 따라 이 루어 지기 때 문 입 니 다.
django.contrib.contenttypes.models 파일 을 찾 아 보 았 습 니 다.

class ContentType(models.Model):
  app_label = models.CharField(max_length=100)
  model = models.CharField(_('python model class name'), max_length=100)
  objects = ContentTypeManager()

  class Meta:
    verbose_name = _('content type')
    verbose_name_plural = _('content types')
    db_table = 'django_content_type'
    unique_together = (('app_label', 'model'),)

  def __str__(self):
    return self.name
ContentType 은 간단 한 django model 이 고 데이터베이스 에 있 는 표 의 이름 은 django 입 니 다.content_type。
이 표 의 이름 은 일반적으로 낯 설 지 않 습 니 다.Django 의 model 을 처음 migrate 한 후에 데이터베이스 에 기본적으로 생 성 된 django 라 는 이름 이 나타 난 것 을 발견 할 수 있 습 니 다.content_type 의 시계.
model 을 만 들 지 않 았 다 면 기본 djangocontent_type 은 다음 과 같 습 니 다:

그래서 djangocontent_type 은 현재 Django 프로젝트 의 모든 model 이 속 한 app(즉 applabel 속성)및 model 의 이름(즉 model 속성).
물론 djangocontent_type 은 속성 만 기록 하 는 것 이 아니 라 contenttypes 는 model 에 대한 패키지 입 니 다.
따라서 contenttypes 를 통 해 model 형식 에 동적 으로 접근 할 수 있 으 며,매번 import 의 구체 적 인 model 형식 이 필요 하지 않 습 니 다.
4.567917.ContentType 인 스 턴 스 가 제공 하 는 인터페이스 
  • ContentType.model_class() 
    현재 ContentType 유형 이 대표 하 는 모델 클래스 를 가 져 옵 니 다
  • ContentType.get_object_for_this_type() 
  • 현재 ContentType 유형 이 대표 하 는 모델 류 를 사용 하여 get 조 회 를 한 번 합 니 다
  • ContentType 관리자(manager)가 제공 하 는 인터페이스 
  • ContentType.objects.get_for_id() 
  • id 를 통 해 ContentType 유형 을 찾 습 니 다.이것 은 전통 적 인 get 방법 과 차이 점 이 바로 get 입 니 다.for_model 은 캐 시 를 공유 하기 때문에 더욱 추천 합 니 다
  • ContentType.objects.get_for_model() 
  • model 또는 model 의 인 스 턴 스 를 통 해 ContentType 유형 을 찾 습 니 다
  • 3.Django ContentTypes 의 사용 장면
    우리 프로젝트 에서 각종 상품 의 할인 권 은 이 지식 점 에 활용 되 었 다.
    만약 우리 모델 아래 에 이 몇 장의 시계 가 있다 면:
    
    class Electrics(models.Model): #   
      name = models.CharField(max_length=32)
      price= models.IntegerField(default=100)
    
      def __str__(self):
        return self.name
    
    
    class Foods(models.Model):   #   
      name = models.CharField(max_length=32)
      price = models.IntegerField(default=100)
    
      def __str__(self):
        return self.name
    
    
    class Clothes(models.Model):  #   
      name = models.CharField(max_length=32)
      price= models.IntegerField(default=100)
      def __str__(self):
        return self.name
    
    class Coupon(models.Model):  #   
      name = models.CharField(max_length=32)
    
      def __str__(self):
        return self.name
    우 리 는 먼저 이 상품 들 을 어떻게 할인 권 과 관련 시 킬 것 인 가 를 고려 합 시다.
    하나의 상품 에 하나의 할인 권 을 넣 으 면 우 리 는 표 에 하나의 상품 의 쿠폰 을 넣 습 니 다.바로 한 쌍 이 많은 ForeignKey 입 니 다.그러면 여러 상품 에 각종 할인 권 이 있 습 니 다.
    그러나 한 상품 의 특정한 혜택 볼 륨 은 표 구조 에 있 습 니 다.그 필드 에 가치 가 있 고 다른 관련 이 없 는 기록 은 null 입 니 다.또한 하나의 상품 을 추가 할 때마다 수 동 으로 외부 키 를 추가 해 야 합 니 다.
    이것 은 번거롭다!
    그래서 저 희 는 contenttypes 응용 프로그램 에서 제공 하 는 특수 필드 인 GenericForeignKey 를 사용 하여 위의 문 제 를 해결 할 수 있 습 니 다.
    다음 세 단계 만 필요 합 니 다:
  • model 에서 ForeignKey 필드 를 정의 하고 ContentType 표 와 연결 합 니 다.보통 이 필드 의 이름 은"content"입 니 다.type”
  • model 에서 Positive Integer Field 필드 를 정의 하여 관련 표 의 메 인 키 를 저장 합 니 다.보통 이 필드 는"object"라 고 명명 합 니 다.id”
  • model 에서 GenericForeignKey 필드 를 정의 하고 상기 두 필드 의 이름 을 입력 합 니 다
  • 구체 적 인 실례 코드:
    
    class Coupon(models.Model):
      name = models.CharField(max_length=32)
    
      content_type = models.ForeignKey(to=ContentType) # step 1
      object_id = models.PositiveIntegerField() # step 2
      content_object = GenericForeignKey('content_type', 'object_id') # step 3
    
      def __str__(self):
        return self.name
    이렇게 되면 표 의 데 이 터 를 불문 하고 조회 할 수 있 고 새로운 상품 을 추가 하 는 상품 도 쿠폰 의 소스 코드 를 움 직 일 필요 가 없다.
    그러나 우리 가 조회 하 는 과정 에서 ORM 을 사용 하 는 것 은 너무 번 거 롭 기 때문에 역방향 조회 방법 도 있다.
    바로 모든 상품 에서 하나의 관 계 를 연결 하 는 것 입 니 다.
    
    coupons = GenericRelation(to='Coupon') #       ,       
    이렇게 하면 우 리 는 바로 ORM 의 coupons 에서 해당 하 는 필드 를 찾 을 수 있 습 니 다!

    좋은 웹페이지 즐겨찾기