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

时间:2012-01-21 01:43:55

标签: python mysql django model

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

这很像this question asked,但我想知道你将如何在Django中做到这一点。以下是一个类似情况的问题的摘录:

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

我知道you can't have multiple primary keys in a Django model,您可以使用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")

在模型中使用this answer来完成我正在寻找的东西?模型之间的关系是ModelA一个ModelBModelB,但每个ModelA只有一个{{1}}。

2 个答案:

答案 0 :(得分: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)

您可以看到,我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

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

答案 1 :(得分:0)

Jason Ennio 的回答不会让您更新模型,因为 super(ModelA, self).save(*args, **kwargs) 由 'if' 语句控制。

更新了“保存”方法(缩进)以防止模型在每次更新时更新“密钥”:

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)