Django模型根据外键的自增主键

13 投票
2 回答
8517 浏览
提问于 2025-04-17 10:44

我正在尝试弄清楚如何设计我的两个Django模型,以便在将新模型保存到数据库时,它的主键会自动增加,成为所有具有相同外键的记录中下一个最高的值。

这就像这个问题,但我想知道在Django中该怎么做。以下是问题中的一段,展示了类似的情况:

id | job_id | title
0     1        hi
1     1        hello
2     1        goodbye
0     2        hi
1     2        hello

我知道在Django模型中不能有多个主键,你可以使用unique_together,但是文档说它使用的是相应的UNIQUE语句在CREATE语句中。那

class ModelA(models.Model):
   key = models.PositiveIntegerField(primary_key = True)
   fk = models.ForeignKey(ModelB)

   def Meta(self):
      unique_together = ("key", "fk")

在模型中使用这个答案能实现我想要的效果吗?模型之间的关系是一个ModelA有多个ModelB,但每个ModelB只有一个ModelA

2 个回答

0

Jason Ennio的回答会导致你无法更新模型,因为super(ModelA, self).save(*args, **kwargs)这个部分是被'if'语句控制的。

更新后的'save'方法(缩进)可以防止每次更新时模型都更新'key':

class ModelA(models.Model):
key = models.PositiveIntegerField()
fk = models.ForeignKey(ModelB)

def Meta(self):
    unique_together = ("key", "fk")

def save(self, *args, **kwargs):
    if self._state.adding is True:
        key = cal_key(self.fk)
        self.key = key
        super(ModelA, self).save(*args, **kwargs)
13

你需要对模型做一些修改(如果可以的话)。所以,ModelA 应该看起来像这样:

class ModelA(models.Model):
    key = models.PositiveIntegerField()
    fk = models.ForeignKey(ModelB)

    def Meta(self):
        unique_together = ("key", "fk")

    def save(self, *args, **kwargs):
        key = cal_key(self.fk)
        self.key = key
        super(ModelA, self).save(*args, **kwargs)

正如你所看到的,我重写了默认的 save 方法,目的是在一个叫 cal_key 的函数中计算关键值,这个函数需要一个 fk 参数。所以,你需要在模型文件中定义 cal_key 函数。

def cal_key(fk):
    present_keys = ModelA.objects.filter(fk=fk).order_by('-key').values_list('key', flat=True)
    if present_keys:
        return present_keys[0]+1
    else:
        return 0

cal_key 函数清楚地表明了你实际需要的内容。

撰写回答