Django 管理更改列表过滤/链接到其他模型

标签 django filter foreign-keys admin changelist

我的模型设置如下:

class ParentModel(models.Model):
    some_col = models.IntegerField()
    some_other = models.CharField()

class ChildModel(models.Model)
    parent = models.ForeignKey(ParentModel, related_name='children')

class ToyModel(models.Model)
    child_owner = models.ForeignKey(ChildModel, related_name='toys')

现在在我的管理面板中,当我打开 ParentModel 的更改列表时我想要 list_display 中的一个新字段/列,并带有一个链接来打开 ChildModel 的更改列表但使用应用过滤器仅显示所选父级的子级。现在我用这种方法实现了它,但我认为有一种更清洁的方法,我只是不知道如何:
class ParentAdmin(admin.ModelAdmin)
    list_display = ('id', 'some_col', 'some_other', 'list_children')
    def list_children(self, obj):
        url = urlresolvers.reverse('admin:appname_childmodel_changelist')
        return '<a href="{0}?parent__id__exact={1}">List children</a>'.format(url, obj.id)
    list_children.allow_tags = True
    list_children.short_description = 'Children'        

admin.site.register(Parent, ParentAdmin)

所以我的问题是,如果没有这种“链接黑客”,是否有可能实现相同的目标?
也可以在 ParentModel 的单独列中指出更改列表,如果它的任何 child 有玩具?

最佳答案

我认为您显示 list_children 的方法列是正确的。不要担心“链接黑客”,这很好。

要显示一列以指示对象的任何 child 是否有玩具,只需在 ParentAdmin 上定义另一个方法即可。类,并将其添加到 list_display像以前一样。

class ParentAdmin(admin.ModelAdmin):
    list_display = ('id', 'some_col', 'some_other', 'list_children', 'children_has_toys')
    ...
    def children_has_toys(self, obj):
        """
        Returns 'yes' if any of the object's children has toys, otherwise 'no'
        """
        return ToyModel.objects.filter(child_owner__parent=obj).exists()
    children_has_toys.boolean = True

设置 boolean=True意味着 Django 将像处理 bool 字段一样呈现“开”或“关”图标。请注意,这种方法需要每个父级一个查询(即 O(n))。您必须进行测试,看看您是否在生产中获得了可接受的性能。

关于Django 管理更改列表过滤/链接到其他模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8551272/

相关文章:

django - 在序列化器剩余框架中序列化连接表

python - Django 访问表单中的外键字段

python - Pandas :按集合中包含的字段过滤

过滤以显示已过滤的父任务列表的子任务

php - Yii2中如何实现join查询

python - Django cms - 尝试在页面列表上发布或取消发布页面时出现 Javascript "undefined"字符串警报错误

Django 管理员 : how to sort by one of the custom list_display fields that has no database field

java - 单击时 Android 微调器不显示

java - 使用联接将表 2 和表 3 中的数据添加到表 1 时出现 MySQL 查询问题

sql - 如何将子表的删除级联到父表?