รับชื่อคลาสของโมเดล django


107

ฉันมีโมเดล django:

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

และฉันต้องการให้ชื่อรุ่นเป็นสตริง: 'จอง' เมื่อฉันพยายามทำให้เป็นแบบนี้:

Book.__class__.__name__

มันส่งคืน 'ModelBase'

ความคิดใด ๆ ?

คำตอบ:



50

แทนที่จะทำBook.__class__.__name__ในชั้นเรียนเองถ้าคุณทำกับวัตถุหนังสือก็book_object.__class__.__name__จะให้ 'หนังสือ' (เช่นชื่อรุ่น)


1
อันนี้ช่วยฉันในกรณีของฉัน ฉันรวมชุดข้อมูล 2 ชุดที่เป็นแบบจำลองที่แตกต่างกัน ในการวนซ้ำฉันต้องการชื่อคลาสของอ็อบเจ็กต์เมื่อฉันทำซ้ำ
ปีเตอร์

ปีเตอร์คุณรวมสองแบบสอบถามได้อย่างไร ?? หรือชุดที่ผสานเป็นเพียงรายการของโมเดลอินสแตนซ์ ?? ขอบคุณ
little_birdie

40

ตามคำแนะนำของ คำตอบข้างต้น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

3
นี่ควรเป็นคำตอบที่ได้รับการยอมรับสำหรับ Django เวอร์ชันใหม่กว่า
Bobort

คุณถูกต้อง @Bobort มันใช้งานได้กับเวอร์ชัน Django 2.2.3ด้วย
Kushan 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()ด้วยรหัส python (เช่นในเทมเพลต{{book.class_name}}) ระบบจะส่งคืนชื่อคลาสซึ่งเป็น 'หนังสือ'


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_nameและverbose_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.