如何在django

时间:2018-04-08 15:30:54

标签: python django django-models

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

1 个答案:

答案 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?