class Activity(Model):
place=ForeignKeyField('Place')
....
class Place(Model):
address=CharField(max_length=200)
....
class Park(Place):
ticket_price=Decimal()
....
class Restarant(Place):
manager_name=CharField(max_length=100)
如何在Activity的查询中获得真实类型的“Place”,这样我就可以获得子类型的其他属性。
activity_list= Activity.objects.all()
所有activity_list [n] .place都是'Place',既不是Park也不是Restarant,所以我不能直接获得'ticket_price'或'manager_name'。
我检查过model-utils,找不到一种简单的方法。
任何帮助将不胜感激。
答案 0 :(得分:0)
尝试:
activity_list= Activity.objects.all()
for act in activity_list:
for b in act.place.__class__.__bases__:
print b.__name__
答案 1 :(得分:0)
inspect.getmro(CLS)
以方法解析顺序返回类cls基类的元组,包括cls。在这个元组中没有类出现过多次。请注意,方法解析顺序取决于cls的类型。除非使用非常特殊的用户定义的元类型,否则cls将是元组的第一个元素。
尝试:
import inspect
for activity in activity_list:
print inspect.getmro(activity.place)
或尝试:
for activity in activity_list:
print activity.place._type()
答案 2 :(得分:0)
我从Inheritance Managers开始使用Django django-model-utils。它允许你完全按照你想要的那样做...你说你检查过model-utils来做这件事,但它没有用。它应该工作 - 你用django-model-utils尝试了什么?您需要将此行添加到Place
的父模型:
objects = InheritanceManager()
我没有尝试过您的确切模型设计,但您尝试过类似的事情:
places = Activity.objects.all().values_list('place_id', flat=True)
places_of_right_type = Place.objects.filter(pk__in=places).select_subclasses()
------更新-------- 不确定这会起作用,但是把它作为一个想法扔掉那里......只适用于get(),而不是全部():
places = Activity.objects.get(pk=#).place.objects.select_subclasses()
文档说你可以在InheritanceManager本身上调用select_subclasses(),它存储在.objects
中。