在djang中获取继承的模型对象

2024-04-24 11:39:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个django应用程序,其模型如下:

ObjectA是一个简单的对象,它是由几个字段扩展而来的,比如说,一个特定的对象是一个名为“NAME”的字符字段和一个名为“ORDER”的整数字段。A是抽象的,这意味着数据库中没有A对象,而是。。。在

对象BCA的特化,这意味着它们继承了A并添加了一些其他字段。在

现在假设我需要字段名称以字母“Z”开头的所有对象,按顺序字段排序,但我也需要这些对象的所有BC特定字段。现在我看到了两种方法:

a)分别对BC对象执行查询,获取两个列表,合并它们,手动排序并处理。在

b)查询A对象,查找以“Z”排序者“ORDER”开头的名称,并根据结果查询bC对象以获取所有剩余数据。在

这两种方法听起来效率都很低,第一种方法我必须自己订购,第二种方法我必须多次查询数据库。在

有没有一种神奇的方法可以把所有BC对象以一种方法排序?或者至少是一种比上述两种方法更有效的方法?在

提前谢谢!在

布鲁诺


Tags: 对象django方法name模型数据库应用程序排序
3条回答

如果A可以是具体的,那么可以使用select_related在一个查询中完成这一切。在

from django.db import connection
q = A.objects.filter(NAME__istartswith='z').order_by('ORDER').select_related('b', 'c')
for obj in q:
   obj = obj.b or obj.c or obj
   print repr(obj), obj.__dict__ # (to prove the subclass-specific attributes exist)
print "query count:", len(connection.queries)

使用“b”方法进行查询,将允许您“引入”所有剩余数据,而无需分别查询b和C模型。您可以使用“点小写模型名”关系。在

http://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

for object in A.objects.filter(NAME__istartswith='z').order_by('ORDER'):
    if object.b:
        // do something
        pass
    elif object.c:
        // do something
        pass

您可能需要尝试并排除doesnotex异常。我的django有点生疏了。祝你好运。在

这个问题得到了回答here。在

{{a3}使用项目^ a2}。在

相关问题 更多 >