Django错误:问题匹配查询不存在()将问题和选项更新为主键

mo49yndu  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(122)

我目前正在尝试官方Django教程民意调查应用程序。它要求我为一个民意调查应用程序创建问题,然后再创建答案选择。我在创建问题时犯了一个错误,不知何故创建了一个空的查询集,我相信它将空问题的主键分别设置为1和2。我接着创建了问题3、4和5。我意识到空格在那里,我试图删除这两个问题。在运行delete()命令后,我删除了它们。我想主键会被删除,所有东西都会滑回原位。我的问题是谁发明了python,仍然是pk=3。
现在我不知道该怎么办。我应该创建一个答案选择的主键id 3,并运行它吗?或者我应该想办法重新分配答案选项。
我问过Django论坛网站,有人推荐我运行这个命令
`[(q.id,q.question_text)for q in Question.objects.all()]'
此命令输出:

>>> [(q.id, q.question_text) for q in Question.objects.all()]
[(3, 'Who invented python?'), (4, 'This question was changed by dot notation on the object.'), (5, 'Who invented Django?')]
>>> clear

我采取了哪些步骤来解决问题?

  • 我已经检查了教程网站上的说明,以更新空槽,我已经寻找一种方法来添加一个问题回来,使它将采取主键槽一,但-我只发现,我的方式将创建另一个问题与主键为下一个顺序。
  • 我看了状态溢出的文章,他们说不要触摸主键。
  • 我也问过Django论坛关于不和谐的问题。

我在期待什么
我希望有一个解决方案,其中我可以有一个问题,它的答案选择占用pk=1和2插槽,即使有pk=3和4的问题等等。

r6vfmomb

r6vfmomb1#

如果您必须这样做,下面的代码可以实现您的需求,但会影响性能。

from django.db import models
from django.db.models import Min

def get_next_id(Model):
    ids = set(Model.objects.values_list('id', flat=True))
    min_id = Model.objects.all().aggregate(Min('id'))['id__min'] or 1
    while min_id in ids:
        min_id += 1
    return min_id

class Question(models.Model):
    ...
    def save(self, *args, **kwargs):
        if not self.pk and Question.objects.filter(pk=self.pk).exists():
            self.pk = get_next_id(Question)
        super(Question, self).save(*args, **kwargs)

相关问题