【问题标题】:how to renumber id when the row deleted in django在django中删除行时如何重新编号id
【发布时间】:2018-09-18 01:27:27
【问题描述】:

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

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    首先,阅读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()
    

    虽然我确实认为这不是真正的方法,因为您不会使用数据库的完整性机制,并且保存一个实例至少需要对数据库进行几次调用,尽管我们可以包装它在一个原子事务中。所以我想问自己一个好问题是是否真的有必要将 ID 重置回 1?

    【讨论】:

      猜你喜欢
      • 2011-01-01
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多