我正在做一些效率不高的事情。從我下面的代碼中,你可能會看到我試圖允許將多個不同類型的配置文件附加到我的自定義用戶對象(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