gpt4 book ai didi

Django admin list_display 未显示多个对象

转载 作者:行者123 更新时间:2023-12-04 21:53:05 31 4
gpt4 key购买 nike

我刚刚开始使用 Django 管理 View ,开始时,我试图做一些非常简单的事情:使用 list_display 显示对象列表中的几个字段,如下所述:https://docs.djangoproject.com/en/dev/ref/contrib/admin/

这是我死的简单代码:

class ArticleAdmin(admin.ModelAdmin):
list_display = ('title', 'category')

不幸的是,list_display 选项导致柱状 View 出现,但现在只有部分对象(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

[更新] 仅当外键字段包含在 list_display 元组中时才会发生此行为。任何一位。

[更新] 类别型号代码:
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

最佳答案

此行为是由某处未声明为可为空但在数据库中具有空值的外键关系引起的。当 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,但我不建议这样做。

真正的解决方法是确保您的外键模型字段在其空设置中准确反射(reflect)数据库的状态。就我个人而言,我可能会通过注释掉除 Category 以外的文章上的所有 FK 来做到这一点,看看是否有帮助,然后将它们一一打开,直到事情开始破裂。问题不一定是文章本身的 FK;如果修订版、语言或类别的 FK 损坏仍会导致连接丢失行。或者如果他们相关的东西有损坏的 FK 等等。

关于Django admin list_display 未显示多个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16364191/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com