基于外键的Django模型自动增量主键

Dir*_*irk 10 python mysql django model

我试图找出如何布置我的两个Django模型,以便在将新模型保存到数据库时,其主键递增,使得它是具有相同外键的所有记录的下一个最高值.

这问题就像这个问题,但我想知道你将如何在Django中做到这一点.以下是该问题的摘录,该问题表明了类似的情况:

id | job_id | title
0     1        hi
1     1        hello
2     1        goodbye
0     2        hi
1     2        hello
Run Code Online (Sandbox Code Playgroud)

我知道你不能在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")
Run Code Online (Sandbox Code Playgroud)

在模型中使用这个答案来完成我正在寻找的东西?模型之间的关系是ModelA具有多个ModelBs 的模型,但每个模型ModelB只有一个ModelA.

San*_*wal 11

Dirk,你必须对模型进行一些更改(如果允许的话),正如Ignacio所说的那样.所以,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)
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我必须overridden the default save method来计算的方法键值cal_key回吐fk as argument.因此,请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
Run Code Online (Sandbox Code Playgroud)

cal_key方法清楚地表明了您实际需要的内容.