我正在创建一个新的Django(1.7)模型:
class MyModel(models.Model):
field1 = models.ForeignKey('OtherModel')
field2 = models.ForeignKey('AnotherModel', null=True)
field3 = models.PositiveSmallIntegerField(db_index=True, null=True)
other_field1 = models.FloatField(default=0, db_index=True)
class Meta:
unique_together = (('field1', 'field2', 'field3'), )
理想情况下,我希望它有元组(field1
,field2
,field3
)作为主键,但是that's not possible at the moment。
因此,我有一个自动生成并递增的id
列,这是Django所要求的,但对我的代码的其余部分完全没有用。你知道吗
我希望能够经常(几乎连续地)删除和重新创建这个模型的实例。
出于性能方面的考虑,我希望避免使用create_or_update
方法,因为从我测试的方法来看,删除和创建要快得多(使用create_or_update
方法的速度是18op/s,使用“delete all and create”方法的速度是72op/s,我希望在我们的生产服务器上这些数字会更高)。
但我恐怕很快(似乎一年左右)也会达到自动增量上限。你知道吗
我想象的其他可能性:
CharField
主键,类似于"{self.field1.pk}/{self.field2.pk}/{self.field3}"
,但我甚至不知道Django是否可以基于实例本身处理主键生成器(优点是即使在field2
和field3
上有null
值,它也能确保唯一性)你知道吗你有什么建议(除了升级到Django的新版本,我知道我迟到了?你认为我在寻找太多的优化吗?你知道吗
堆栈:
如果您有冒险精神,可以尝试将
id
列转换为不带默认值的可为空整数列。你知道吗注意:这将破坏部分模型API、管理和最有可能导致各种不可预见的麻烦,但根据您的用例,它可能只是做您想要的事情。我不是说这是个好主意,我只是给你展示一下选择。你知道吗
也就是说,这是必要的迁移:
仍然可以创建新对象并获取现有对象,但不能直接保存或删除对象:
但是,您可以使用
.filter(...).delete()
和.filter(...).update(...)
:我用来测试这个行为的
MyModel
有三个阳性的malintegerfields,而不是ForeignKeys,但这不会有什么区别:相关问题 更多 >
编程相关推荐