Как вы можете видеть в комментариях этого поста, он все еще спорно обсуждается, что это лучший способ.
Я тоже попробовал это сделать, используя подклассы, но я столкнулся со многими проблемами, в то время как с использованием профилей отлично работает для меня.
class IRCUser(models.Model):
user = models.ForeignKey(User, unique=True)
name = models.CharField(max_length=100, blank= True, null = True )
friends = models.ManyToManyField("IRCUser", blank= True, null = True)
dataRecieved= models.BooleanField(default=False)
создание IRCUser работает так:
>>> IRCUser(user = User.objects.get(username='Kermit')).save()
РЕДАКТИРОВАТЬ: Почему изящные user_profiles:
Предположим, мы пишем веб-приложение, которое будет вести себя как многопротокольный чат. Пользователи могут предоставлять свои учетные записи в ICQ, MSN, Jabber, FaceBook, Google Talk .....
Мы можем создавать пользовательский класс по наследству, который будет содержать всю дополнительную информацию.
class CustomUser(User):
irc_username = models.CharField(blank=True, null=True)
irc_password = models.PasswordField(blank=True, null=True)
msn_username = models.CharField(blank=True, null=True)
msn_password = models.PasswordField(blank=True, null=True)
fb_username = models.CharField(blank=True, null=True)
fb_password = models.PasswordField(blank=True, null=True)
gt_username = models.CharField(blank=True, null=True)
gt_password = models.PasswordField(blank=True, null=True)
....
....
это приводит к
- строки данных с большим количеством нулевых значений
- хитрый что-если-тогда проверка
- невозможность иметь более одного аккаунта с таким же сервисом
Так что теперь давайте сделаем это с user_profiles
class IRCProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='ircprofile')
username = models.CharField()
password = models.PasswordField()
class MSNProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='msnprofile')
username = models.CharField()
password = models.PasswordField()
class FBProfile(models.Model):
user = models.ForeignKey(User, unique=True, related_name='fbprofile')
username = models.CharField()
password = models.PasswordField()
результат:
- User_profiles может быть создан при необходимости
- БД не затопляется нулевыми значениями
- n профилей одного типа могут быть назначены одному пользователю
- проверка проста
это может привести к более загадочному синтаксису в шаблонах, но мы можем использовать некоторые ярлыки в наших views / template_tags или использовать {% with ... %}
, чтобы изменить его, как мы хотим.