ฉันมีโมเดล django:
class Book(models.Model):
[..]
และฉันต้องการให้ชื่อรุ่นเป็นสตริง: 'จอง' เมื่อฉันพยายามทำให้เป็นแบบนี้:
Book.__class__.__name__
มันส่งคืน 'ModelBase'
ความคิดใด ๆ ?
ฉันมีโมเดล django:
class Book(models.Model):
[..]
และฉันต้องการให้ชื่อรุ่นเป็นสตริง: 'จอง' เมื่อฉันพยายามทำให้เป็นแบบนี้:
Book.__class__.__name__
มันส่งคืน 'ModelBase'
ความคิดใด ๆ ?
คำตอบ:
ลองBook.__name__
.
โมเดล Django มาจากModelBase
ซึ่งเป็น Metaclass สำหรับทุกรุ่น
แทนที่จะทำBook.__class__.__name__
ในชั้นเรียนเองถ้าคุณทำกับวัตถุหนังสือก็book_object.__class__.__name__
จะให้ 'หนังสือ' (เช่นชื่อรุ่น)
ตามคำแนะนำของ คำตอบข้างต้น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.2.3
ด้วย
ฉันได้ชื่อชั้นโดยใช้
str(Book._meta)
Book.__class__.__name__ -> this will give you the ModelBase
str(self.model._meta)
คือสิ่งที่ฉันกำลังมองหา ส่วนอีกชั้นให้ชั้นผู้ปกครอง
Book._meta.object_name
หรือBook._meta.model_name
. หากคุณต้องการชื่อแอปด้วยสามารถเข้าถึงได้ผ่านBook._meta.app_label
class Book(models.Model):
[..]
def class_name(self):
return self.__class__.__name__
ด้วยวิธีนี้เมื่อใดก็ตามที่คุณเรียกbook.class_name()
ด้วยรหัส python (เช่นในเทมเพลต{{book.class_name}}
) ระบบจะส่งคืนชื่อคลาสซึ่งเป็น 'หนังสือ'
คุณยังสามารถดึงชื่อรุ่นจากคลาส 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