Django admin list_display没有显示多个对象

时间:2013-05-03 17:03:49

标签: django django-admin

我刚刚开始使用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之前:

Django amdin before list_display

添加list_display后:

Django amdin after 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

1 个答案:

答案 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等等。

相关问题