Django admin的list_display未显示多个对象。

17 浏览
0 Comments

Django admin的list_display未显示多个对象。

我刚开始尝试使用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个对象。

这里可能发生了什么?

[更新] Article模型:

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

[更新] 只有在list_display元组中包含ForeignKey字段时才会出现此行为。其中任何一个。

[更新] Category模型代码:

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
0 Comments

这个问题的出现是因为在某个地方有一个外键关系,但没有声明为可为空,但在数据库中却有一个空值。当在list_display中有一个ManyToOne关系时,change list类将始终使用select_related执行查询。select_related默认情况下会跟踪每个对象上的所有外键,所以当查询被评估时,任何损坏的外键都会导致数据丢失。这不仅仅适用于admin;您可以通过比较Article.objects.all()和Article.objects.all().select_related()的结果来进行交互测试。

没有简单的方法来控制管理员查找的外键-select_related有一些参数,但管理员没有公开传递它们的方法。理论上,您可以编写自己的ChangeList类并覆盖get_query_set,但我不建议这样做。

真正的解决方法是确保您的外键模型字段准确地反映了数据库中的空设置。个人而言,我可能会通过注释掉Article上除Category之外的所有FK来做到这一点,看看是否有帮助,然后逐个重新启用它们,直到出现问题。问题不一定是与文章本身的FK相关;如果一个修订版本、语言或分类有一个损坏的FK,那么仍然会导致连接缺少行。或者如果它们相关的某个东西有一个损坏的FK,等等。

0