我刚刚开始使用Django管理员视图,开始时,我正在尝试做一些非常简单的事情:使用list_display显示对象列表中的几个字段,如下所示:https://docs.djangoproject.com/en/dev/ref/contrib/admin/
这是我死的简单代码:
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'category')
不幸的是,list_display选项导致出现柱状视图,但现在只有一些对象(85个中的40个)显示在列表中。我无法推断为什么某些物体会显示在其他物体上 - 它们的场看起来像是相似的。它显然不是分页,因为当我在另一个模型的管理员上尝试它时,它只显示了大约70个对象中的2个对象。
这里可能会发生什么?
[更新] 文章型号:
class Article(models.Model):
revision = models.ForeignKey('ArticleRevision', related_name="current_revision")
category = models.ForeignKey('meta.Category')
language = models.ForeignKey('meta.Language', default=get_default_language)
created = models.DateTimeField(auto_now_add=True, editable=False)
changed = models.DateTimeField(auto_now=True, editable=False)
title = models.CharField(max_length=256)
resources = models.ManyToManyField('oer.Resource', blank=True)
image = models.ManyToManyField('media.Image', blank=True)
views = models.IntegerField(editable=False, default=0)
license = models.ForeignKey('license.License', default=get_default_license)
slug = models.SlugField(max_length=256)
difficulty = models.PositiveIntegerField(editable=True, default=0)
published = models.NullBooleanField()
citation = models.CharField(max_length=1024, blank=True, null=True)
在添加list_display之前:
添加list_display后:
[UPDATE] 仅当list_display元组中包含ForeignKey字段时,才会出现此问题。他们中的任何一个。
[更新] 类别型号代码:
class Category(models.Model):
title = models.CharField(max_length=256)
parent = models.ForeignKey('self')
project = models.NullBooleanField(default=False)
created = models.DateTimeField(auto_now_add=True, editable=False)
slug = models.SlugField(max_length=256, blank=True)
def __unicode__(self):
return self.title
答案 0 :(得分:15)
此行为是由某个未声明为可为空的外键关系引起的,但在数据库中仍具有空值。当list_display中有ManyToOne关系时,更改列表类将始终使用select_related执行查询。 (请参阅django.contrib.admin.views.ChangeList中的get_query_set
方法。)
默认情况下,select_related跟在每个对象上的所有外键之后,因此在查询查询时,此查询找到的任何损坏的外键都会导致数据丢失。这不是管理员特有的;您可以通过将Article.objects.all()的结果与Article.objects.all()。select_related()进行比较来进行交互式测试。
没有简单的方法来控制管理员查找哪些外键 - select_related需要一些参数,但是管理员没有公开传递它们的方法。从理论上讲,您可以编写自己的ChangeList类并覆盖get_query_set,但我不建议这样做。
真正的解决方法是确保您的外键模型字段在其null设置中准确反映数据库的状态。就我个人而言,我可能会通过评论除分类以外的所有文章上的所有FK,看看是否有帮助,然后逐个将它们重新开始直到事情开始破坏。问题不一定与文章本身的FK有关;如果修订版,语言或类别的FK损坏,仍会导致联接错过行。或者,如果他们涉及的东西有破损的FK等等。