我想设置某些型号的行数限制。为了实现这一点,当我在django中向数据库中添加一个新行时,我想删除旧行并重新编号id(pk)。
通过参考以下关于上述问题的链接,我能够设置行数限制并删除旧行。
Limit the number of rows in a Django table
然而,这个解决方案,当旧行删除时, id(pk)也被删除。 如果我设置的限制行数是100,删除数据库后的行ID从101开始。 要解决此问题,我想在删除旧ID时将id重新编号为1。 你能告诉我如何实现它吗?
class History(models.Model):
history = models.IntegerField(default=0)
def save(self):
objects = History.objects.all()
print(id)
if objects.count() > 100:
objects[0].delete()
self.save()
class Player(models.Model):
user = models.CharField(max_length=255)
game_count = models.IntegerField(default=0)
medal = models.IntegerField(default=100, verbose_name='medal')
game_history = models.ForeignKey(History, on_delete=models.CASCADE,
verbose_name='game_history', null=True)
def __str__(self):
return self.user
答案 0 :(得分:2)
首先,阅读related thread的答案可能会有用。
如果您真的想这样做,我猜您可以创建自己的主键字段并每次都自己设置。
from django.db import transaction
from django.db.models import F, Max
class History(models.Model):
id = models.PositiveIntegerField(primary_key=True)
history = models.IntegerField(default=0)
def save(self):
with transaction.atomic():
count = History.objects.count()
objects = History.objects.all()
if count > 100:
objects[0].delete()
if count > 1:
objects.update(id=F('id') - 1)
if not self.id and count > 0:
objects = objects.refresh_from_db() # Update QuerySet
self.id = objects.annotate(max_count=Max('id')).max_count + 1
elif not self.id and count == 0:
self.id = 1
self.save()
虽然我确实认为它不是真正的方法,因为你不会使用DB的完整性机制,并且保存一个实例至少需要几次调用DB,尽管我们可以包装它在原子事务中。所以我想问一个好问题是,是否真的有必要将ID重置为1?