Django模型根据外键的自增主键
我正在尝试弄清楚如何设计我的两个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
函数清楚地表明了你实际需要的内容。