我希望在我的简单博客应用的管理面板中有一个标签列表。 ManyToManyFields不允许作为list_display
的输入,所以我想创建一个获取标记的方法并将此方法放在列表中。
我的问题是我不知道如何在我的模型中访问另一个类。
我的models.py
class Tag(models.Model):
tag = models.CharField(max_length=25)
def __unicode__(self):
return self.tag
class Post(models.Model):
author = models.ForeignKey(User)
publication = models.DateTimeField()
title = models.CharField(max_length=100)
summary = models.TextField(max_length=150)
content = models.TextField(max_length=9999)
tag = models.ManyToManyField(Tag)
commentsAllowed = models.BooleanField()
def getTags(self):
return Post.tag.all() <-----------------------------------
def __unicode__(self):
return self.title
我的admin.py
class PostAdmin(admin.ModelAdmin):
date_hierarchy = 'publication'
list_display = ('author', 'title', 'publication', 'getTags')
这会返回<django.db.models.fields.related.ReverseManyRelatedObjectsDescriptor object at 0xb8e24fcc>
,但我想要标记名称。
答案 0 :(得分:3)
你想要self.tags.all()
,因为它是具有关系的实例,而不是类。
答案 1 :(得分:1)
list_display
期望其项目是对象(实例)或管理类方法。在这两种情况下,他们都应该返回可以投放到unicode
的内容。
我宁愿把它放在这样的管理类中:
class PostAdmin(admin.ModelAdmin):
list_display = ('tags',)
def tags(self, obj):
return u", ".join(obj.tag.all())
def get_queryset(self, request):
return super(PostAdmin, self).get_queryset(request).prefetch_related('tag')
我添加了一个get_queryset
方法来修改查询集,以便现在使用单个查询预取标记。多亏了这一点,管理员中显示的 x 行没有 x 查询。