Nhận tên lớp của mô hình django


107

Tôi có một mô hình django:

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

và tôi muốn có tên mô hình là chuỗi: 'Sách'. Khi tôi cố gắng làm theo cách này:

Book.__class__.__name__

nó trả về 'ModelBase'.

Bất kỳ ý tưởng?

Câu trả lời:


153

Cố gắng Book.__name__.

Các mô hình Django bắt nguồn từ ModelBaseMetaclass cho tất cả các mô hình.


48

Thay vì thực hiện Book.__class__.__name__trên chính lớp, nếu bạn thực hiện trên một đối tượng sách, thì book_object.__class__.__name__sẽ cung cấp cho bạn 'Sách' (tức là tên của mô hình)


1
Điều này đã giúp tôi trong trường hợp của tôi. Tôi đã hợp nhất 2 bộ truy vấn thuộc các mô hình khác nhau. Trong một vòng lặp, tôi cần lấy tên lớp của đối tượng khi tôi lặp lại.
Peter

Peter, làm thế nào bạn hợp nhất hai bộ truy vấn ?? Hay tập hợp đã hợp nhất chỉ là một danh sách các trường hợp mô hình ?? Cảm ơn
little_birdie

38

Theo gợi ý của câu trả lời ở trên , bạn có thể sử dụng str(Book._meta).

Câu hỏi này khá cũ, nhưng tôi thấy câu hỏi sau hữu ích (đã thử nghiệm trên Django 1.11, nhưng có thể hoạt động trên các phiên bản cũ hơn ...), vì bạn cũng có thể có cùng một tên kiểu máy từ nhiều ứng dụng.

Giả sử Sách ở my_app:

print(Book._meta.object_name)
# Book

print(Book._meta.model_name)
# book

print(Book._meta.app_label)
# my_app

2
Đây phải là câu trả lời được chấp nhận cho các phiên bản mới hơn của Django.
Bobort

Bạn đúng @Bobort, nó cũng đang hoạt động trên phiên bản Django 2.2.3.
Kushan Gunasekera

8

Tôi có tên lớp bằng cách sử dụng,

str(Book._meta)

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

Cảm ơn; str(self.model._meta)là những gì tôi đang tìm kiếm; như đối với cái khác cho tôi lớp cha.
ppython 16/1017

Nếu bạn muốn một cái gì đó ẩn ý hơn một lệnh gọi tới chuỗi, thì bạn có thể nhận được điều tương tự (đã thử trên Django 1.11) với: Book._meta.object_namehoặc Book._meta.model_name. Sau đó, nếu bạn muốn tên ứng dụng, có thể truy cập thông quaBook._meta.app_label
Geekfish

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

Với cách này, bất cứ khi nào bạn gọi book.class_name()bằng mã python (cũng trong mẫu {{book.class_name}}), nó sẽ trả về tên lớp là 'Sách'.


3

Bạn cũng có thể truy xuất tên mô hình từ lớp Meta của mô hình. Điều này hoạt động trên chính lớp mô hình cũng như bất kỳ trường hợp nào của nó:

# 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

Cài đặt verbose_nameverbose_name_plural là tùy chọn. Django sẽ suy ra các giá trị này từ tên của lớp mô hình (bạn có thể nhận thấy việc sử dụng các giá trị đó trong trang web quản trị).

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.