我正在做一些效率不高的事情。从我下面的代码中,你可能会看到我试图允许将多个不同类型的配置文件附加到我的自定义用户对象(Person)中。其中一个配置文件将被视为默认配置文件,并应具有Person类的访问者。在配置文件中存储is_default
字段似乎不是跟踪默认值的最佳方式,是吗?如何处理每个用户的多个配置文件?
from django.db import models
from django.contrib.auth.models import User, UserManager
class Person(User):
public_name = models.CharField(max_length=24, default="Mr. T")
objects = UserManager()
def save(self):
self.set_password(self.password)
super(Person, self).save()
def _getDefaultProfile(self):
def_teacher = self.teacher_set.filter(default=True)
if def_teacher: return def_teacher[0]
def_student = self.student_set.filter(default=True)
if def_student: return def_student[0]
def_parent = self.parent_set.filter(default=True)
if def_parent: return def_parent[0]
return False
profile = property(_getDefaultProfile)
def _getProfiles(self):
# Inefficient use of QuerySet here. Tolerated because the QuerySets should be very small.
profiles = []
if self.teacher_set.count(): profiles.append(list(self.teacher_set.all()))
if self.student_set.count(): profiles.append(list(self.student_set.all()))
if self.parent_set.count(): profiles.append(list(self.parent_set.all()))
return profiles
profiles = property(_getProfiles)
class BaseProfile(models.Model):
person = models.ForeignKey(Person)
is_default = models.BooleanField(default=False)
class Meta:
abstract = True
class Teacher(BaseProfile):
user_type = models.CharField(max_length=7, default="teacher")
class Student(BaseProfile):
user_type = models.CharField(max_length=7, default="student")
class Parent(BaseProfile):
user_type = models.CharField(max_length=7, default="parent")
我已经避免从BaseProfile中移除抽象,希望在模板中到达我的“类型”配置文件之前不必穿过另一个层。然而,我错过的那个谜题的缺失部分是在模型上创建访问器,从模板中遮盖了该图层。 现在我看到,走这条路线开辟了一系列更好的方式来做到这一点,这正是我所期待的。我会尝试这种方法,谢谢Killian! – Scott 2010-05-08 16:43:39