我正在做一个有三种用户类型的DRF后端:客户,私人教练和健身房老板。我希望CustomUser类中的所有字段都应用于每个用户类型。我还希望每个用户类型的一些特定属性(例如,照片只为私人教练和健身房老板)。这是正确的做法吗?
# models.py
class CustomUser(AbstractUser):
USER_TYPE_CHOICES = (
('customer'),
('personal_trainer'),
('gym_owner'),
)
user_type = models.CharField(blank=False, choices=USER_TYPE_CHOICES)
name = models.CharField(blank=False, max_length=255)
country = models.CharField(blank=False, max_length=255)
city = models.CharField(blank=False, max_length=255)
phone = models.CharField(blank=True, max_length=255)
ratings = models.ForeignKey(Rating, on_delete=models.CASCADE, null=True)
created_at = models.DateField(auto_now_add=True)
def __str__(self):
return self.name
class Customer(models.Model):
user = models.OneToOneField(
CustomUser, on_delete=models.CASCADE, primary_key=True)
class PersonalTrainer(models.Model):
user = models.OneToOneField(
CustomUser, on_delete=models.CASCADE, primary_key=True)
photo = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)
class GymOwner(models.Model):
user = models.OneToOneField(
CustomUser, on_delete=models.CASCADE, primary_key=True)
photo = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)
我也有一个评级模型。我希望能够将客户评级留给私人教练或健身房。每个评级都与它的所有者和目标有一对一的关系。但是我不确定我如何才能建立这种关系..?
# models.py
class Rating(models.Model):
STAR_CONVERSION = (
(1, 'One Star'),
(2, 'Two Stars'),
(3, 'Three Stars'),
(4, 'Four Stars'),
(5, 'Five Stars'),
)
rating = models.PositiveSmallIntegerField(choices=STAR_CONVERSION)
caption = models.TextField(blank=True)
owner = models.OneToOneField(Customer, on_delete=models.CASCADE)
# I want a target as a one to one relation to either PersonalTrainer or GymOwner
target = models.OneToOneField(*either personal trainer or gym owner*)
发布于 2019-03-12 22:04:37
您需要将owner
和target
都设置为ForeignKey
,而不是OneToOneField
。对于后者,每个客户只能有一个评级,每个提供商只能有一个评级,这将有一点限制:)。
对于PersonalTrainer
和GymOwner
,您需要模型继承。父模型可以是抽象类(数据保存在各个子模型的表中),或者(在这种情况下,因为两个模型的字段相同),数据将保存在父模型(例如Provider
)中,而子模型将基于父模型的数据进行proxy models,但在适当的地方提供不同的行为。
关于不同的继承选项,Django docs有很多话要说。
class Provider(models.Model):
user = models.OneToOneField(
CustomUser, on_delete=models.CASCADE, primary_key=True)
photo = models.ImageField(upload_to='photos/%Y/%m/%d/', blank=True)
class PersonalTrainer(Provider):
class Meta:
proxy = True
class GymOwner(Provider):
class Meta:
proxy = True
class Rating(models.Model):
# ...
owner = models.ForeignKey(Customer, on_delete=models.CASCADE)
target = models.ForeignKey(Provider, on_delete=models.CASCADE)
https://stackoverflow.com/questions/55122192
复制相似问题