0

我想在我的简单博客应用程序的管理面板中有一个标签列表。ManyToManyFields 不允许作为输入,list_display因此我想创建一个获取标签的方法并将此方法放入列表中。

我的问题是我不知道如何在我的模型中访问其他类。

我的模型.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

我的管理员.py

class PostAdmin(admin.ModelAdmin):
    date_hierarchy = 'publication'
    list_display = ('author', 'title', 'publication', 'getTags')

这返回了我<django.db.models.fields.related.ReverseManyRelatedObjectsDescriptor object at 0xb8e24fcc>,但我想要标签名称。

4

2 回答 2

3

您想要self.tags.all(),因为它是具有关系的实例,而不是类。

于 2013-10-06T18:03:25.903 回答
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查询。

于 2013-10-06T18:13:57.593 回答