장고 모델의 클래스 이름 가져 오기


107

장고 모델이 있습니다.

class Book(models.Model):
  [..]

모델 이름을 문자열 'Book'으로 지정하고 싶습니다. 이런 식으로 얻으려고 할 때 :

Book.__class__.__name__

'ModelBase'를 반환합니다.

어떤 생각?

답변:


153

시도해보십시오 Book.__name__.

Django 모델은 ModelBase모든 모델의 Metaclass 인 에서 파생됩니다 .


49

Book.__class__.__name__수업 자체에서 수행하는 대신 책 객체에 book_object.__class__.__name__대해 수행하면 'Book'(즉, 모델 이름)이 제공됩니다.


1
이것은 내 경우에 도움이되었습니다. 모델이 다른 두 개의 쿼리 세트를 병합했습니다. 루프에서 반복 할 때 객체의 클래스 이름을 가져와야했습니다.
Peter

Peter, 두 개의 쿼리 세트를 어떻게 병합 했습니까 ?? 아니면 병합 된 집합이 모델 인스턴스 목록일까요 ?? 감사합니다
little_birdie

38

에 의해 제안 된 것과 같은 위의 대답은 , 당신은 사용할 수 있습니다 str(Book._meta).

이 질문은 꽤 오래되었지만 여러 앱에서 동일한 모델 이름을 가질 수 있으므로 다음이 도움이된다는 것을 알았습니다 (Django 1.11에서 테스트되었지만 이전 버전에서 작동 할 수 있습니다 ...).

책이 다음 위치에 있다고 가정합니다 my_app.

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

2
이것은 최신 버전의 Django에서 허용되는 답변이어야합니다.
Bobort

@Bobort가 맞습니다 2.2.3. Django 버전 에서도 작동합니다 .
쿠샨 Gunasekera

8

사용하여 클래스 이름을 얻었습니다.

str(Book._meta)

Book.__class__.__name__  -> this will give you the ModelBase

감사; str(self.model._meta)내가 찾던 것입니다. 다른 하나는 부모 클래스를주세요.
ppython

문자열을 호출하는 것보다 더 암시적인 것을 원한다면 다음을 사용하여 동일한 결과를 얻을 수 있습니다 (Django 1.11에서 시도) : Book._meta.object_name또는 Book._meta.model_name. 그런 다음 앱 이름도 원하는 경우 다음을 통해 액세스 할 수 있습니다.Book._meta.app_label
Geekfish

4
class Book(models.Model):
  [..]   
  def class_name(self):
    return self.__class__.__name__

이런 식으로 book.class_name()파이썬 코드 (템플릿에서도) 를 호출 할 때마다 {{book.class_name}}'Book'이라는 클래스 이름을 반환합니다.


3

모델의 Meta 클래스에서 모델 이름을 검색 할 수도 있습니다. 이것은 모델 클래스 자체와 그것의 모든 인스턴스에서 작동합니다.

# Model definition
class Book(models.Model):
    # fields...

    class Meta:
        verbose_name = 'book'
        verbose_name_plural = 'books'


# Get some model
book = Book.objects.first()

# Get the model name
book._meta.verbose_name

설정 verbose_nameverbose_name_plural선택 사항입니다. Django는 모델 클래스의 이름에서 이러한 값을 유추합니다 (관리 사이트에서 이러한 값을 사용하는 것을 눈치 챘을 수 있습니다).

https://docs.djangoproject.com/en/3.0/ref/models/options/#verbose-name

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.