获取models.py中对象的所有ManyToManyField-Entries

时间:2013-10-06 17:25:50

标签: django django-models django-admin

我希望在我的简单博客应用的管理面板中有一个标签列表。 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>,但我想要标记名称。

2 个答案:

答案 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 查询。