Django: доступ к методу дочерних разных дочерних классов через общее имя - PullRequest
1 голос
/ 11 августа 2010

У меня есть абстрактный базовый класс для определения общих атрибутов, общих для разных профилей пользователей.

class Profile(models.Model):
   ...

   def has_permissions(self, project):
      ...

   class Meta:
      abstract = True

class Standard(Profile):
   ...

class Premium(Profile):
   ...

Теперь я хотел бы проверить разрешение определенного пользователя (которому всегда назначен один отдельный профиль), не зная, какой у него профиль, например

user.profile.has_permission(project)

Но это не работает, потому что базовый класс "Профиль" является абстрактным. Есть ли способ обойти эту проблему? И есть ли способ узнать имя абстрактного родительского класса из дочернего объекта?

Спасибо, Daniel

Ответы [ 2 ]

1 голос
/ 11 августа 2010

переписать метод auth.User get_profile (), чтобы исследовать его во всех моделях дочернего профиля, пока не найдете его:

  class MyUser(auth.models.User):
        profile = models.OneToOneField(Profile)
        def get_profile(self):
            prof = None
            try:
                prof = Standard.objects.get(id=self.profile.pk)
            except ObjectDoesNotExist:
                prof = Premium.objects.get(id=self.profile.pk)
            return prof

сейчас, вместо этого:

user.profile.has_permission(project)

Вы можете использовать это:

user.get_profile().has_permission(project)

Я надеюсь, что это поможет вам.

0 голосов
/ 11 августа 2010

Я не совсем уверен, что это лучший подход.Код корректен в объектном смысле, но не соответствует представлению базы данных (IMHO).User будет иметь только одну profile, но таблица базы данных будет иметь ссылки на несколько Profile таблиц.

Как насчет:

  1. Создать профиль в общем отношении, который может соединятьсяк любому виду профиля
  2. иметь один класс профиля и определять разрешения на основе атрибута экземпляра («премиум» или «стандарт»)

Мне любопытно узнать, что думают другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...