在django中检查相关模型的超类

时间:2015-07-22 01:20:36

标签: python django django-models

我有一个AuthUser模型,我使用get_profile()调用来获取有关用户的一些信息(忽略不推荐使用配置文件的事实 - 我并没有真正将它们用作配置文件)。但是,有两种不同的配置文件模型(StudentStaffMember)都是一个抽象模型(SchoolPerson)的子类。以下代码在django 1.6中有效,但不再适用于django 1.8:

def get_profile(self):
    for related in self._meta.get_all_related_objects():
        if related.model.__base__.__name__ == 'SchoolPerson':  # TODO - might we have non-SchoolPerson profiles?
            try:
                return getattr(self, related.get_accessor_name())
            except ObjectDoesNotExist:
                pass
    raise ObjectDoesNotExist

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

根据Django 1.8文档,PRIMARY KEY方法已经被弃用,虽然这意味着它应该暂时仍然有用...据说你可以尝试更新从例子中找到的所有弃用方法{{3 }}

对于给定示例的get_all_related_objects()(复制并粘贴)

get_all_related_objects()

这只是一个建议。让我知道你是怎么做的:D

答案 1 :(得分:1)

感谢指点;这就是我最终使用的东西。尽管如此,仍然没有解决为什么它首先失败的原因: - /

def get_profile(self):
    for field in self._meta.get_fields():
        if field.one_to_one and 'SchoolPerson' in [base.__name__ for base in field.related_model.__bases__]:
            try:
                return getattr(self, field.get_accessor_name())
            except ObjectDoesNotExist:
                pass
    raise ObjectDoesNotExist

答案 2 :(得分:0)

查看文档的Migrating from the old API部分。它有例子。考虑用MyModel._meta.get_all_related_objects()代替

[
    f for f in MyModel._meta.get_fields()
    if (f.one_to_many or f.one_to_one) and f.auto_created
]