Je fais quelque chose qui ne me semble pas très efficace. De mon code ci-dessous, vous pouvez probablement voir que j'essaie d'autoriser plusieurs profils de différents types attachés à mon objet utilisateur personnalisé (personne). Un de ces profils sera considéré comme un défaut et devrait avoir un accesseur de la classe Person. Stocker un champ is_default
sur le profil ne semble pas être le meilleur moyen de garder une trace d'un défaut, n'est-ce pas?comment gérer plusieurs profils par utilisateur?
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")
J'avais évité de retirer l'abstraction du BaseProfile dans l'espoir de ne pas avoir à traverser une autre couche avant d'atteindre mes profils 'typés' dans les templates. Cependant, la pièce manquante à ce casse-tête que j'ai raté était la création d'accesseurs sur le modèle qui obscurci cette couche à partir des modèles. Maintenant, je vois que cette route ouvre une foule de meilleures façons de le faire, ce qui est exactement ce que je cherchais. Je vais expérimenter avec cette approche, merci Killian! – Scott