我刚刚开始使用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]**此行为仅当ForeignKey字段包含在list_display元组中时才会发生。任何一个
**[UPDATE]**类别型号编码:
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条答案
按热度按时间l5tcr1uw1#
此行为是由某个外键关系引起的,该关系未声明为可空,但在数据库中具有空值。当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,但我不推荐这样做。
真实的的解决办法是确保外键模型字段在其空设置中准确地反映数据库的状态。就我个人而言,我可能会通过评论掉所有的FK来做到这一点,看看这是否有帮助,然后一个接一个地打开它们,直到事情开始破裂。问题不一定是文章本身的FK;如果修订、语言或类别的FK断开,则仍会导致连接丢失行。或者如果他们涉及的东西有一个破碎的FK,等等。