Django contenttypes 프레임 상세 설명(소결)
5414 단어 Djangocontenttypes
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 유형 이 대표 하 는 모델 클래스 를 가 져 옵 니 다
우리 프로젝트 에서 각종 상품 의 할인 권 은 이 지식 점 에 활용 되 었 다.
만약 우리 모델 아래 에 이 몇 장의 시계 가 있다 면:
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 를 사용 하여 위의 문 제 를 해결 할 수 있 습 니 다.
다음 세 단계 만 필요 합 니 다:
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 에서 해당 하 는 필드 를 찾 을 수 있 습 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django 라우팅 계층 URLconf 작용 및 원리 해석URL 구성(URLconf)은 Django가 지원하는 웹 사이트의 디렉토리와 같습니다.그것의 본질은 URL과 이 URL을 호출할 보기 함수 사이의 맵표입니다. 위의 예제에서는 URL의 값을 캡처하고 위치 매개 변수로...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.