ฉันมีหลายโมเดลที่เชื่อมต่อถึงกันด้วยความสัมพันธ์ ForeignKeys
โมเดลหลักในลำดับชั้นประเภทนี้มีฟิลด์ เจ้าของ
ฉันต้องการสร้าง ตัวจัดการแบบกำหนดเองตัวเดียว สำหรับ โมเดลเหล่านี้ทั้งหมด ที่เปลี่ยนชุดแบบสอบถามที่ส่งคืน ขึ้นอยู่กับโมเดลที่เรียกมัน
ฉันรู้ว่าผู้จัดการสามารถเข้าถึง self.model
เพื่อรับโมเดลที่แนบมาด้วย
Class Main(models.Model)
owner=models.ForeignKey (User)
owned = OwnedManager()
Class Second(models.Model)
main=models.ForeignKey('Main')
owned = OwnedManager()
Class Third(models.Model)
second=models.ForeignKey('Second')
owned = OwnedManager()
ฉันต้องการให้ Custom Manager ของฉันมีพฤติกรรมประเภทนี้:
class OwnedManager(models.Manager):
def get_owned_objs(self, owner):
if self.model == 'Main': # WRONG: How do I get the model name?
owned_main = self.filter(owner=owner)
return owned_main
elif self.model == 'Second':
owned_second = self.filter(main__owner=owner)
return owned_second
else:
owned_third = self.filter(second__main__owner=owner)
return owned_third
เพื่อให้มีวิธีเรียกข้ามรุ่นต่างๆ ที่สอดคล้องกัน เช่น:
main_object.owned.get_owned_objs(owner=user1) # of the Model Main
second_object.owned.get_owned_objs(owner=user1) # of the Model Second
third_object.owned.get_owned_objs(owner=user1) # of the Model Third
คำถาม:
self.model == 'Main'
ผิด ฉันไม่ได้ชื่อรุ่นเช่นนี้ มีวิธีที่จะได้รับมันหรือไม่?- สิ่งนี้มีประสิทธิภาพหรือไม่? คุณรู้วิธีที่ดีกว่าในการดำเนินการนี้หรือไม่? บางทีอาจเป็นมรดกผู้จัดการแบบกำหนดเอง?
แก้ไข - วิธีแก้ปัญหาของฉัน: คำตอบที่ยอมรับด้านล่างเป็นวิธีแก้ปัญหาที่ดี แต่ฉันยังพบวิธีรับชื่อรุ่นของรุ่นนั้น ๆ ที่เรียกใช้ตัวจัดการแบบกำหนดเองด้วย นั่นคือ:
if self.model.__name__ == 'Main':
กุญแจสำคัญที่นี่คือแอตทริบิวต์ __name__