запрос родителя в наследовании модели в django «многие ко многим» по ключевому слову

У меня есть следующая проблема:

Мои модели настроены аналогично следующему сценарию

class Membership(models.Model):
    user = models.ForeignKey(User)
    verified = models.BooleanField()

class ClubMembership(Membership):
    club = models.ForeignKey(Club)

class ForumMembership(Membership):
    forum = models.ForeignKey(Forum)

class Club(models.Model):
    members = models.ManyToManyField(User, through='ClubMembership')

class Forum(models.Model):
    members = models.ManyToManyField(User, through='ForumMembership')

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

memberships = Membership.objects.filter(verified=False)

и это дает мне список всех членств с проверенным = False. Однако я не могу найти способ 1) проверить, к какому подклассу принадлежит членство, и 2) я не могу получить доступ к полю «клуб» или «форум», даже если я знаю тип подкласса. Есть ли способ получить доступ к типу базового класса после того, как я запросил базовый класс, и как мне получить доступ к полям подкласса?


person Kristian    schedule 11.11.2013    source источник


Ответы (1)


1) проверить, к какому подклассу принадлежит членство

Вы можете сделать это, проверив атрибут

if hasattr(membershipobj, 'clubmembership'):
   #its base for ClubMembership
elif hasattr(membershipobj, 'forummembership'): 
  #its for ForumMembership

2) Я не могу получить доступ к полю "клуб" или "форум"

Доступ к полям дочерних объектов через дочерний объект

membershipobj.clubmembership.club  
membershipobj.forummembership.forum  
person Rohan    schedule 11.11.2013
comment
Я пробовал этот метод раньше, но я не использовал строчные имена для подклассов. Долго на это потрачено время. Благодарю вас! - person Kristian; 11.11.2013
comment
Для полноты, имена подклассов должны быть заключены в кавычки, чтобы это работало. - person Kristian; 11.11.2013