首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django中的多个用户类型和评级

Django中的多个用户类型和评级
EN

Stack Overflow用户
提问于 2019-03-12 21:05:37
回答 1查看 99关注 0票数 0

我正在做一个有三种用户类型的DRF后端:客户,私人教练和健身房老板。我希望CustomUser类中的所有字段都应用于每个用户类型。我还希望每个用户类型的一些特定属性(例如,照片只为私人教练和健身房老板)。这是正确的做法吗?

代码语言:javascript
运行
复制
# 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)

我也有一个评级模型。我希望能够将客户评级留给私人教练或健身房。每个评级都与它的所有者和目标有一对一的关系。但是我不确定我如何才能建立这种关系..?

代码语言:javascript
运行
复制
# 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*)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-12 22:04:37

您需要将ownertarget都设置为ForeignKey,而不是OneToOneField。对于后者,每个客户只能有一个评级,每个提供商只能有一个评级,这将有一点限制:)。

对于PersonalTrainerGymOwner,您需要模型继承。父模型可以是抽象类(数据保存在各个子模型的表中),或者(在这种情况下,因为两个模型的字段相同),数据将保存在父模型(例如Provider)中,而子模型将基于父模型的数据进行proxy models,但在适当的地方提供不同的行为。

关于不同的继承选项,Django docs有很多话要说。

代码语言:javascript
运行
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55122192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档