2015-07-22 4 views
0

У меня есть модель AuthUser, в которой я использую вызов get_profile(), чтобы получить информацию о пользователе (игнорируйте тот факт, что профили устарели - я не использую их в качестве профилей). Однако существуют две разные модели профиля (Student и StaffMember), как подклассификация абстрактной модели (SchoolPerson). Следующий код работал в django 1.6, но больше не работает на django 1.8:Проверка суперкласса связанной модели в django

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 

Любые идеи?

+0

Почему это не работает? Что такое трассировка? API-интерфейс _meta был нормализован в django 1.8 – Alvaro

ответ

1

Согласно документации 1.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

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 
] 
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 
Смежные вопросы