django - Django 模型和 UniqueConstraint
问题描述
那是我在 Django 中的第一个项目,所有这些数据库建模对我来说都是新概念。对不起,如果我都错了。
我确实有一个以前的模型正在工作。一个区域有多个站点,一个站点有多个路线。它们是我无法更改的旧表。
class Region(models.Model):
regionnumber = models.IntegerField(db_column='RegionNumber', primary_key=True)
engname = models.CharField(db_column='EngName', max_length=15, blank=True, null=True)
def __str__(self):
return self.engname
class Depot(models.Model):
region = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True)
depotcode = models.CharField(db_column='DEPOTCODE', primary_key=True)
depotname = models.CharField(db_column='DEPOTNAME', max_length=50, blank=True, null=True)
def __str__(self):
return self.depotcode + " " + self.depotname
class Route(models.Model):
reg_no = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True)
off_no = models.ForeignKey(Depot, on_delete=models.SET_NULL, null=True,)
res_route = models.CharField(db_column='res_route', max_length=9)
现在我必须在此模型中添加一个日期以跟踪时间变化(例如:2020 年将创建或关闭一些站点,与站点中的路线相同)。
像这样的东西。
class EvaluationDate(models.Model):
ev_date = models.DateField(db_column='ev_date', primary_key=True) # Field name made lowercase.
def __str__(self):
return str(self.ev_date)
class Region(models.Model):
regionnumber = models.IntegerField(db_column='RegionNumber', primary_key=True)
engname = models.CharField(db_column='EngName', max_length=15, blank=True, null=True)
def __str__(self):
return self.engname
class Depot(models.Model):
region = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True)
depotcode = models.CharField(db_column='DEPOTCODE', max_length=5, blank=True, null=True) # Field name made lowercase.
depotname = models.CharField(db_column='DEPOTNAME', max_length=50, blank=True, null=True)
eval_date = models.ForeignKey(EvaluationDate, on_delete=models.SET_NULL, null=True) # Field name made lowercase.
def __str__(self):
return self.depotcode + " " + self.depotname
class Meta:
constraints = [
models.UniqueConstraint(fields=['depotcode', 'eval_date'], name='depot_eval_date')
]
class Route(models.Model):
reg_no = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True)
off_no = models.ForeignKey(Depot, on_delete=models.SET_NULL, null=True,)
res_route = models.CharField(db_column='res_route', max_length=9)
evaluation_date = models.ForeignKey(EvaluationDate, on_delete=models.SET_NULL, null=True)
那有意义吗。这是做事的好方法吗?
现在,当我迁移我的表“路由”时,添加了以下字段:
- evaluation_date_id 作为 DATE
- off_no_id 作为 INT
- reg_no_id 作为 INT
但是“off_no_id”应该是一个字符串而不是一个整数(遗留数据)(例如:off_no = “A001”)。那是因为我删除了仓库中的主键,现在迁移很困惑吗?
我也尝试将“related_name”添加到我的模型“路线”中来解决这个问题,但我不确定这是否是要走的路。
class Route(models.Model):
reg_no = models.ForeignKey(Region, on_delete=models.SET_NULL, null=True)
off_no = models.ForeignKey(Depot, related_name='depotcode', on_delete=models.SET_NULL, null=True,)
res_route = models.CharField(db_column='res_route', max_length=9)
evaluation_date = models.ForeignKey(EvaluationDate, on_delete=models.SET_NULL, null=True)
解决方案
推荐阅读
- html - 在循环中显示 jsp,直到用户输入正确的值
- filter - Kibana 过滤关键字计数
- android - 在卸载应用程序之前,如何运行服务永不结束?
- java - 处理表格视图中的按钮单击事件
- javascript - ReactJS 水平时间轴组件
- javascript - ReactJS 一次性初始化
- qt - 在 Qt Creator 中自动重建依赖项
- python - 将索引附加到 laspy 文件 (.las)
- yii2 - 如何将值从数据库传递到kartik复选框列表
- mysql - 在 Laravel 中,我想将列类型从 varchar 更改为 double 它会给出错误。但是在创建列时它可以正常工作