【问题标题】:Django: Calling delete() method on only() raise exception DoesNotExistDjango:在 only() 上调用 delete() 方法引发异常 DoesNotExist
【发布时间】:2017-08-12 15:05:59
【问题描述】:

假设我有以下模型:

class Student(models.Model):
   name = models.CharField(max_length = 100)
   ...

当我尝试在 only() 上调用 delete() 方法时,例如:

Student.object.filter(pk__in=[1, 5, 6]).only('id', 'name').delete()

我收到以下错误:

DoesNotExist: Student matching query does not exist

我的问题是:我们不能在 only() 上调用 delete() 吗?

注意:我们在 Django 管理员的 get_queryset() 方法上使用 only() 以获得更好的性能。

为了您的信息,我的管理员看起来像:

class StudentAdmin(admin.ModelAdmin):
   def get_queryset(self, request):
       qs = super(StudentAdmin, self).get_queryset(request)
       return qs.only('id', 'name', ...)

当我们尝试从 Admin 中删除对象时,我们会收到此错误。

【问题讨论】:

  • 模型的主要字段是什么? Django 使用主键与对象交互。您可能不会将其包含在 only()
  • DoesNotExists 仅在 Model.objects.get() 中提出。因此,如果您使用 get early 编写了相同的代码..您的服务器是否已重新启动?如果问题在重新启动后也消失了..删除所有 *.pyc 文件。我试过只删除它,它对我来说效果很好。很遗憾无法在此处为您发布。
  • @ThulasiRam,我想,你误解了这个问题。我说的是only() method
  • @AndreyShipilov,此模型中没有主键。因此,默认情况下 id 是主键。正如我所提到的,id 字段包含在 only 调用中。

标签: django django-admin django-orm


【解决方案1】:

看来你做错了。改变

qs = super(ShipmentAdmin, self).get_queryset(request)

qs = super(StudentAdmin, self).get_queryset(request)

【讨论】:

  • 在这里误写了 ShipmentAdmin。在实际代码中,它是正确的。编辑问题。
猜你喜欢
  • 2019-12-22
  • 2020-11-07
  • 2012-06-21
  • 2011-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
相关资源
最近更新 更多