ists,Модели Django: подход подкласса?
Я ищу некоторую проверку на подклассическом подходе. У меня есть следующий:
class Person(models.Model):
"""
Basic person
"""
user = models.ForeignKey(User) # hide
first_name = models.CharField(max_length=200)
last_name = models.CharField(blank=True, max_length=200)
class Meta:
verbose_name_plural = "People"
def __unicode__(self):
return u"%s, (%s)" % (self.first_name, self.user)
class Contributor(Person):
"""
Contributor
A Core contributor of the site content workflow
"""
class Meta:
verbose_name = 'contributor'
verbose_name_plural = 'contributors'
def get_articles(self):
"""
Return the articles that the author has published.
"""
return Article.objects.filter(self_in=authors)
class Member(Person):
"""
Member
A Member of the website.
"""
# Member history, payments etc...
joined = models.DateTimeField()
Таким образом, каждый член или Вкладчик является лицом в системе, но это возможно для человека, чтобы быть «None», 1 или оба членов & Вкладчика, в зависимости от контекста.
Этот подклассов подход позволяет легко делать такие вещи, как:
#...
contributors = models.ManyToManyField(Contributor, help_text="Contributors/Authors to this article")
или
print Member.objects.all()
... и, конечно, обычные эффективностей подклассов, то есть общих полей и методов.
Однако, мне интересно, о плюсах & против делать что-то вроде
class Person(models.Model):
"""
Person
"""
user = models.ForeignKey(User) # hide
first_name = models.CharField(max_length=200)
last_name = models.CharField(blank=True, max_length=200)
is_contributor = models.BooleanField()
is_member = models.BooleanField()
но необходимости фильтровать такие вещи, как
# Assuming this is possible...
contributors = models.ManyToManyField(Person.objects.filter(is_contributor=True), help_text="Contributors/Authors to this article")
С подклассов подходе Интересно о проблемах осознавать пользователей, которые являются людьми (людьми), членами или участниками, и быть способными различать между ними.
т.е. его очень легко сделать if person.is_contributor:
, но, возможно, более сложных
try:
Contributor.objects.get(person__user_id=request.user.id)
except:
no_access()
else:
let_them_in()
Извинения для открытого endness этого вопроса - это, возможно, было больше, возможность думать вслух.