如何在查询中获取foreignkeyfield的子实例

时间:2014-11-26 19:55:39

标签: django foreign-keys

我有三节课。 Place是Activity的外键(活动所在的地方),Park和Restarant是从Place继承的。

 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,找不到一种简单的方法。

任何帮助将不胜感激。

3 个答案:

答案 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中。