如何在 Django 中删除行时重新编号 ID



我想在某些模型中设置行数的限制。 为了实现这一点,当我在 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?

最新更新