在djang中检验一个相关模型的超类

2024-03-29 14:44:37 发布

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

我有一个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

有什么想法吗?你知道吗


Tags: django用户name模型self信息get配置文件
3条回答

看看文档的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
]

谢谢你的指点;这是我最后使用的。但仍然没有弄清楚当初失败的原因:-/

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

根据django1.8文档,get_all_related_objects()方法已经被弃用了,尽管这意味着它应该暂时还可以工作。。也就是说,您可以尝试更新从示例here中找到的所有不推荐使用的方法

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

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
]

这只是一个建议。告诉我你进展如何:D

相关问题 更多 >