具有许多共同属性的多种类型的用户
Multiple types of User with many mutual attributes
如何创建两个具有许多共同属性的 User
类型?据我所知,创建两种 User
的最佳做法是创建 2 个 UserProfiles
。我有类型 - Firm
和 Person
。所以我决定创建两个 UserProfiles
:
class FirmProfile(models.Model):
user = models.OneToOneField(User, related_name='firmprofile')
prefered_times = ...
favourite_food = ...
class PersonProfile(models.Model):
user = models.OneToOneField(User, related_name='personprofile')
prefered_times = ...
favourite_food = ...
现在,我正在寻找一种不必将这些属性写两次的方法。可能吗?
编辑:我已经创建了这个,但我不确定它是否是最佳选择,因为每个 UserProfile 都会有两个配置文件 - 公司和个人
class UserProfile(User):
user = models.OneToOneField(User, related_name='userprofile')
TYPE_OF_USER_CHOICES = (('firm','Firm'),
'person','Person')
type_of_user = models.CharField(max_length=40, choices=TYPE_OF_USER_CHOICES)
class FirmProfile(models.Model):
user = models.OneToOneField(User, related_name='firmprofile')
class PersonProfile(models.Model):
user = models.OneToOneField(User, related_name='personprofile')
有很多方法可以做到这一点https://docs.djangoproject.com/en/1.9/topics/db/models/#model-inheritance
最简单的是创建 abstract
模型
class BaseProfile(models.Model):
prefered_times = ...
favourite_food = ...
class Meta:
abstract = True
class FirmProfile(BaseProfile):
user = models.OneToOneField(User, related_name='firmprofile')
... # all custom fields can be defined here
class PersonProfile(BaseProfile):
user = models.OneToOneField(User, related_name='personprofile')
...
回复评论
您可以像这样检查用户类型
def get_user_type(user):
if getattr(user, 'firmprofile', None):
return 'firm'
elif getattr(user, 'personprofile', None):
return 'person'
else:
return None
如何创建两个具有许多共同属性的 User
类型?据我所知,创建两种 User
的最佳做法是创建 2 个 UserProfiles
。我有类型 - Firm
和 Person
。所以我决定创建两个 UserProfiles
:
class FirmProfile(models.Model):
user = models.OneToOneField(User, related_name='firmprofile')
prefered_times = ...
favourite_food = ...
class PersonProfile(models.Model):
user = models.OneToOneField(User, related_name='personprofile')
prefered_times = ...
favourite_food = ...
现在,我正在寻找一种不必将这些属性写两次的方法。可能吗?
编辑:我已经创建了这个,但我不确定它是否是最佳选择,因为每个 UserProfile 都会有两个配置文件 - 公司和个人
class UserProfile(User):
user = models.OneToOneField(User, related_name='userprofile')
TYPE_OF_USER_CHOICES = (('firm','Firm'),
'person','Person')
type_of_user = models.CharField(max_length=40, choices=TYPE_OF_USER_CHOICES)
class FirmProfile(models.Model):
user = models.OneToOneField(User, related_name='firmprofile')
class PersonProfile(models.Model):
user = models.OneToOneField(User, related_name='personprofile')
有很多方法可以做到这一点https://docs.djangoproject.com/en/1.9/topics/db/models/#model-inheritance
最简单的是创建 abstract
模型
class BaseProfile(models.Model):
prefered_times = ...
favourite_food = ...
class Meta:
abstract = True
class FirmProfile(BaseProfile):
user = models.OneToOneField(User, related_name='firmprofile')
... # all custom fields can be defined here
class PersonProfile(BaseProfile):
user = models.OneToOneField(User, related_name='personprofile')
...
回复评论 您可以像这样检查用户类型
def get_user_type(user):
if getattr(user, 'firmprofile', None):
return 'firm'
elif getattr(user, 'personprofile', None):
return 'person'
else:
return None