gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:35:47 26 4
gpt4 key购买 nike

我的模型设置如下:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com