我正在试图弄清楚如何布置我的两个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
一个ModelB
个ModelB
,但每个ModelA
只有一个{{1}}。
答案 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)