我想在某些模型中设置行数的限制。 为了实现这一点,当我在 Django 中向数据库中添加新行时,我想删除旧行并重新编号 id(pk(。
通过参考以下有关上述问题的链接,我能够设置行数限制并删除旧行。
限制 Django 表中的行数
但是,此解决方案,当旧行删除时,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
首先,阅读相关线程的答案可能会很有用。
如果你真的想这样做,我想你可以创建自己的主键字段,每次都自己设置。
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()
虽然我真的认为这不是真正的方法,因为你不会使用数据库的完整性机制,并且保存一个实例至少需要对数据库进行几次调用,尽管我们可以将其包装在原子事务中。所以我认为要问自己的一个好问题是是否真的有必要将 ID 重置回 1?