programing

장고 콘텐츠 유형은 정확히 어떻게 작동합니까?

goodsources 2023. 7. 10. 22:18
반응형

장고 콘텐츠 유형은 정확히 어떻게 작동합니까?

저는 장고의 콘텐츠 유형 개념을 이해하는 데 정말 어려움을 겪고 있습니다.그것은 매우 진부하게 느껴지며, 궁극적으로 Python이 일을 하는 경향에 반대합니다.즉, 장고를 사용하려면 프레임워크의 범위 내에서 작업해야 합니다.

그래서 저는 콘텐츠 유형이 어떻게 작동하고 어떻게 구현하는지에 대한 실제 사례를 제공할 수 있는 사람이 있는지 궁금합니다.거의 모든 튜토리얼(대부분 블로그)제가 검토한 바로는 컨셉을 잘 다루지 않는 것입니다.그들은 장고 문서가 어디서 끝났는지(아무데도 없는 것처럼 보이는 것) 파악하는 것 같습니다.

그래서 당신은 당신의 업무에 컨텐츠 유형 프레임워크를 사용하고 싶습니까?

먼저 다음과 같은 질문을 합니다. "이러한 모델 중 다른 모델과 동일한 방식으로 관계를 유지해야 하는 모델이 있습니까? 아니면 나중에 이러한 관계를 예기치 않은 방식으로 재사용해야 합니까?"이 질문을 하는 이유는 컨텐츠 유형 프레임워크가 모델 간의 일반적인 관계를 형성하는 가장 효과적인 방법이기 때문입니다.이런, 코드를 좀 들여다보고 제 말이 무슨 뜻인지 알아보겠습니다.

# ourapp.models
from django.conf import settings
from django.db import models

# Assign the User model in case it has been "swapped"
User = settings.AUTH_USER_MODEL

# Create your models here
class Post(models.Model):
  author = models.ForeignKey(User)
  title = models.CharField(max_length=75)
  slug = models.SlugField(unique=True)
  body = models.TextField(blank=True)

class Picture(models.Model):
  author = models.ForeignKey(User)
  image = models.ImageField()
  caption = models.TextField(blank=True)

class Comment(models.Model):
  author = models.ForeignKey(User)
  body = models.TextField(blank=True)
  post = models.ForeignKey(Post)
  picture = models.ForeignKey(Picture)

이론적으로 이 관계를 만들 방법이 있습니다.하지만 파이썬 프로그래머로서 당신의 뛰어난 지성은 이것이 형편없고 당신이 더 잘할 수 있다고 말하고 있습니다.하이파이브!

내용 유형 프레임워크를 입력합니다!

이제 모델을 자세히 살펴보고 "재사용 가능"하고 직관적으로 사용할 수 있도록 재작업하겠습니다.우리의 두 개의 외국 키를 제거하는 것으로 시작하겠습니다.Comment하여 델화및으로 합니다.GenericForeignKey.

# ourapp.models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

...

class Comment(models.Model):
  author = models.ForeignKey(User)
  body = models.TextField(blank=True)
  content_type = models.ForeignKey(ContentType)
  object_id = models.PositiveIntegerField()
  content_object = GenericForeignKey()

그래서 어떻게 됐나요?를 고려해서 했습니다. 음, 우는들어가서다의일과인관반적다위니추습필가했코를드요한.어떻게 단순한 것 이상의 것이 있는지 주목하세요.GenericForeignKey뿐만 아니라 또한ForeignKeyContentType a 리고a.PositiveIntegerField를해위를 .object_id이 필드는 Django에게 이 개체가 어떤 개체와 관련되어 있으며 해당 개체의 ID가 무엇인지 알려주기 위한 것입니다.실제로 장고는 이러한 관련 개체를 조회하기 위해 둘 다 필요하기 때문에 이것은 타당합니다.

파이썬 같지는 않은데요좀 못생겼어요!

여러분은 아마도 귀도 반 로섬을 자랑스럽게 할 공기가 새지 않고 흠잡을 데 없이 직관적인 코드를 찾고 있을 것입니다.널 이해해.다음을 살펴보겠습니다.GenericRelation여기에 예쁜 활을 넣을 수 있도록 필드.

# ourapp.models
from django.contrib.contenttypes.fields import GenericRelation

...

class Post(models.Model):
  author = models.ForeignKey(User)
  title = models.CharField(max_length=75)
  slug = models.SlugField(unique=True)
  body = models.TextField(blank=True)
  comments = GenericRelation('Comment')

class Picture(models.Model):
  author = models.ForeignKey(User)
  image = models.ImageField()
  caption = models.TextField(blank=True)
  comments = GenericRelation('Comment')

쾅! 이 두 모델에 대한 코멘트로 작업할 수 있습니다. .python manage.py shellDjango 프로젝트 디렉토리에서).

>>> from django.contrib.auth import get_user_model
>>> from ourapp.models import Picture, Post

# We use get_user_model() since we are referencing directly
User = get_user_model()

# Grab our own User object
>>> me = User.objects.get(username='myusername')

# Grab the first of our own pictures so we can comment on it
>>> pic = Picture.objects.get(author=me)

# Let's start making a comment for our own picture
>>> pic.comments.create(author=me, body="Man, I'm cool!")

# Let's go ahead and retrieve the comments for this picture now
>>> pic.comments.all()
[<Comment: "Man, I'm cool!">]

# Same for Post comments
>>> post = Post.objects.get(author=me)
>>> post.comments.create(author=me, body="So easy to comment now!")
>>> post.comments.all()
[<Comment: "So easy to comment now!"]

그렇게 간단하다.

이러한 "일반적인" 관계의 다른 실질적인 의미는 무엇입니까?

일반 외부 키를 사용하면 다양한 응용 프로그램 간의 침입 관계를 줄일 수 있습니다.예를 들어, 우리가 댓글 모델을 이름이 붙은 자체 앱으로 끌어냈다고 가정해 보겠습니다.chatterly는 " 이이붙다른응프만합을니다자들고램그로용제은름이ation▁named"라는 이름의 다른 응용 프로그램을 .noise_nimbus사람들이 다른 사람들과 공유하기 위해 그들의 음악을 저장하는 곳.

그 노래들에 댓글을 달려면 어떻게 해야 할까요?일반적인 관계를 그릴 수 있습니다.

# noise_nimbus.models
from django.conf import settings
from django.contrib.contenttypes.fields import GenericRelation
from django.db import models

from chatterly.models import Comment

# For a third time, we take the time to ensure custom Auth isn't overlooked
User = settings.AUTH_USER_MODEL

# Create your models here
class Song(models.Model):
  '''
  A song which can be commented on.
  '''
  file = models.FileField()
  author = models.ForeignKey(User)
  title = models.CharField(max_length=75)
  slug = models.SlugField(unique=True)
  description = models.TextField(blank=True)
  comments = GenericRelation(Comment)

을 도움이 되길 . 저는 가 는저여이도되움것바다알랍니의 좀 더 수 있는 입니다. 왜냐하면 저는 저에게 좀 더 현실적인 적용을 보여주는 것을 발견하고 싶었기 때문입니다.GenericForeignKey그리고.GenericRelation

이것이 너무 좋아서 사실이 아닌가요?

인생의 모든 것과 마찬가지로 장단점이 있습니다.코드와 추상화를 더 많이 추가할 때마다 기본 프로세스가 더 무거워지고 속도가 약간 느려집니다.일반적인 관계를 추가하면 결과를 스마트 캐시하려고 해도 성능 저하 요인이 약간 추가될 수 있습니다.전반적으로 청결함과 단순성이 작은 성능 비용을 능가하는지 여부에 달려 있습니다.저에게 있어, 답은 백만 배입니다.

내용 유형 프레임워크에는 여기에 표시한 것보다 더 많은 내용이 있습니다.전체적인 수준의 세분화와 더 장황한 사용법이 있지만, 일반적인 개인의 경우, 제 생각에는 10번 중 9번은 이렇게 사용할 것입니다.

일반 관계자(?) 주의!

다소 큰 경고는 사용할 때GenericRelation 만그모델있다면이약▁the▁which▁▁ifGenericRelationapplicated (Picture()이 있습니다. 모든 관련 항목(Comment 개체도 삭제됩니다.아니면 적어도 이 글을 쓰는 시점에서.

좋아요. 당신의 질문에 대한 직접적인 대답은 (django 소스 코드에서): RFC 2616, 섹션 3.7에 따른 미디어 유형 구문 분석입니다.

이것이 바로 '콘텐츠 유형' httpd 헤더를 읽고/수정할 수 있도록/전달할 수 있도록 하는 눈물의 표현입니다.

그러나 좀 더 실천적인 사용 예제를 요구하고 있습니다.두 가지 제안이 있습니다.

1: 이 코드를 검사합니다.

def index(request):
   media_type='text/html'
   if request.META.has_key('CONTENT_TYPE'):
      media_type = request.META['CONTENT_TYPE'].split(';')[0]

   if media_type.lower() == 'application/json':
      return HttpResponse("""{ "ResponseCode": "Success"}""", content_type="application/json; charset=UTF-8")

   return HttpResponse("<h1>regular old joe</h1>");

2: rememberd jango는 파이썬이며, 따라서 파이썬 커뮤니티의 힘을 휘두릅니다.장고에는 멋진 RESTFull 플러그인이 2개 있습니다.그래서 만약 여러분이 토끼 전체가 얼마나 깊이 들어가는지 보고 싶다면, 여러분은 확인할 수 있습니다.

저는 특히 '다른 콘텐츠/유형에 대한 행동'을 다룰 장고-휴식-프레임워크 튜토리얼을 거치는 것을 제안합니다.참고: 내용 유형 헤더를 사용하여 '버전'의 restful API를 사용하는 것이 일반적입니다.

언급URL : https://stackoverflow.com/questions/20895429/how-exactly-do-django-content-types-work

반응형