Django的多个类型的用户,一个基本的usertype?



我正在尝试创建一个食品配送应用克隆。其中有两种类型的用户餐厅用户和客户。我希望餐厅用户也能够是客户,使用相同的登录信息。

我的模型现在是这样设置的:

class Restaurant(models.Model):
user_name = models.OneToOneField(User, on_delete=models.CASCADE, related_name='restaurant')
full_name = models.CharField(max_length=500)
phone = models.CharField(max_length=500)
employee_id = models.CharField(max_length=500)  
class Customer(models.Model):
user_name = models.OneToOneField(User, on_delete=models.CASCADE, related_name='customer')
full_name = models.CharField(max_length=500)
email = models.CharField(max_length=500)
avatar = models.CharField(max_length=500)
phone = models.CharField(max_length=500)
address = models.CharField(max_length=500)

我不相信这是预期的工作。为登录和共享信息(如user_name、full_name、phone)创建一个基本用户类型会更好吗?

我为此创建了如下代码:

class CustomUser(AbstractUser):
user_name = models.OneToOneField(User, on_delete=models.CASCADE, related_name='CustomUser')
full_name = models.CharField(max_length=500)
phone = models.CharField(max_length=30)

但是我不确定如何在其他用户模型之间连接这个。或者这是否是正确的方法。

那么我如何才能达到我想要做的,我的模型是什么样子的?

这应该有帮助https://docs.djangoproject.com/en/3.1/topics/db/models/#model-inheritance

您可以使用自定义用户作为基类。所以你可以这样传递自定义模型:

class Restaurant(CustomUser):
user_name = models.OneToOneField(User, on_delete=models.CASCADE, related_name='restaurant')
full_name = models.CharField(max_length=500)
phone = models.CharField(max_length=500)
employee_id = models.CharField(max_length=500)  
class Customer(CustomUser):
user_name = models.OneToOneField(User, on_delete=models.CASCADE, related_name='customer')
full_name = models.CharField(max_length=500)
email = models.CharField(max_length=500)
avatar = models.CharField(max_length=500)
phone = models.CharField(max_length=500)
address = models.CharField(max_length=500)

另外,您应该将CustomUser声明为抽象的。

class CustomUser(AbstractUser):
user_name = models.OneToOneField(User, on_delete=models.CASCADE,related_name='CustomUser')
full_name = models.CharField(max_length=500)
phone = models.CharField(max_length=30)
class Meta:
abstract = True

按此执行:

class Restaurant(models.Model):
owner = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='restaurant')
name = models.CharField(max_length=500)
address = models.TextField(max_length=500)
phone = models.CharField(max_length=500)
class RestaurantStaff(models.Model):
restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='staff')
staff = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name='staff')
employee_id = models.CharField(max_length=500)

class CustomUser(AbstractUser):
full_name = models.CharField(max_length=500)
email = models.EmailField(unique=True)
avatar = models.CharField(max_length=500)
phone = models.CharField(max_length=500)
address = models.CharField(max_length=500)

注意:永远不要重复列,如果你在另外两个模型中继承了相同的模型,这两个模型将具有继承模型的相同字段/列。

下面是模型结构的解释:

  1. 只有一个CustomUser模型保存所有用户(客户、餐厅老板、员工)的数据
  2. 餐厅模型保存与餐厅相关的数据(其所有者链接,名称,地址,餐厅电话号码)
  3. RestaurantStaff模型保存了餐厅和用户(即餐厅员工)的关系,因此您可以在其中添加更多字段,如&;start_date&;; &;termination_date&;; &;post&;

您选择的字段类型不正确(例如电话号码应该是整数,但您选择了字符,电子邮件应该是电子邮件字段,但您选择了字符)。使用django已经提供的东西,因为它有助于API中的验证和序列化。

最新更新