Django模型和UniqueConstraint

时间:2019-12-23 22:13:17

标签: django django-models

这是我在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)

这有意义吗?这是做事的好方法吗?

现在,当我迁移表“ route”时,添加了以下字段:

  • evaluation_date_id作为日期
  • off_no_id作为INT
  • reg_no_id作为INT

但是“ off_no_id”应该是STRING,而不是整数(旧版数据)(例如:off_no =“ A001”)。那是因为我删除了仓库中的主键,而现在的迁移却很混乱吗?

我也确实尝试在模型“ route”中添加“ 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)

0 个答案:

没有答案