【发布时间】:2023-02-01 16:03:02
【问题描述】:
我有一个旧的 Django 项目,我是初学者时就开始的。到目前为止它有效,但是由于我想进行一些代码重构,我想更改原始数据库模型。 基本上,我最初做了很多不同的模型,每一个都针对一种用户类型。
旧型号:
class CustomUser(AbstractUser):
user_type_data = (
('admin', 'Admin'),
('instructor', 'Instructor'),
('student', 'Student'),
('renter', 'Renter'),
)
user_type = models.CharField(
max_length=20, choices=user_type_data, default=1)
class Admin(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
date_of_birth = models.DateField(null=True, blank=True)
fiscal_code = models.CharField(max_length=50, null=True, blank=True)
phone = models.CharField(max_length=50, null=True, blank=True)
picture = models.ImageField(
blank=True, null=True, default='default.png')
address = models.CharField(max_length=100, blank=True, null=True)
cap = models.CharField(max_length=10, blank=True, null=True)
city = models.CharField(max_length=100, blank=True, null=True)
province = models.CharField(
max_length=100, choices=PROVINCE_CHOICES, blank=True, null=True)
country = CountryField(blank=True, null=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
is_active = models.BooleanField(default=True)
def __str__(self):
return self.user.username
class Meta:
ordering = ['last_name']
class Instructor(models.Model):
user = models.OneToOneField(CustomUser, on_delete=models.CASCADE)
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
date_of_birth = models.DateField(null=True, blank=True)
fiscal_code = models.CharField(max_length=50, null=True, blank=True)
phone = models.CharField(max_length=50, null=True, blank=True)
picture = models.ImageField(
blank=True, null=True, default='default.png')
address = models.CharField(max_length=100, null=True, blank=True)
cap = models.CharField(max_length=10, null=True, blank=True)
city = models.CharField(max_length=100, null=True, blank=True)
province = models.CharField(
max_length=100, choices=PROVINCE_CHOICES, blank=True, null=True)
country = CountryField(blank=True, null=True)
is_active = models.BooleanField(default=True)
flight_wage = models.FloatField(null=True, blank=True)
theory_wage = models.FloatField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.user.last_name + ' ' + self.user.first_name
class Meta:
ordering = ['last_name']
我只发布了前两种用户类型,但你明白了。大量冗余代码。 我想要实现的是这样的:
新模型.py:
class CustomUser(AbstractUser):
user_type_data = (
('admin', 'Admin'),
('instructor', 'Instructor'),
('student', 'Student'),
('renter', 'Renter'),
)
user_type = models.CharField(
max_length=20, choices=user_type_data, default=1)
first_name = models.CharField(max_length=200)
last_name = models.CharField(max_length=200)
date_of_birth = models.DateField(null=True, blank=True)
fiscal_code = models.CharField(max_length=50, null=True, blank=True)
phone = models.CharField(max_length=50, null=True, blank=True)
picture = models.ImageField(
blank=True, null=True, default='default.png')
address = models.CharField(max_length=100, null=True, blank=True)
cap = models.CharField(max_length=10, null=True, blank=True)
city = models.CharField(max_length=100, null=True, blank=True)
province = models.CharField(
max_length=100, choices=PROVINCE_CHOICES, blank=True, null=True)
country = CountryField(blank=True, null=True)
is_active = models.BooleanField(default=True)
flight_wage = models.FloatField(null=True, blank=True)
theory_wage = models.FloatField(null=True, blank=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.user.last_name + ' ' + self.user.first_name
class Meta:
ordering = ['last_name']
我的问题是:是否可以将我的旧项目(我已经有两个客户在使用旧项目)适应这种新品牌的数据库模型?
【问题讨论】:
-
您需要迁移多少个数据库?不同的版本和产品?
-
我只有两个具有相同版本和相同产品的数据库。我有两所不同的学校使用这个软件,但我可能有其他客户,我想向他们提供这个带有这种新型数据库模型的新版本