首页 > 解决方案 > 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)

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

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

但是“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)

标签: djangodjango-models

解决方案


推荐阅读