Django admin changelist filtering / ссылка на другие модели
у меня есть модели, как это:
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
список изменений, если у кого-то из его детей есть игрушки?
1 ответов
Я думаю, что ваш подход к отображения list_children
столбец правильный. Не беспокойтесь о "взломе ссылок", все в порядке.
чтобы отобразить столбец для указания, есть ли у кого-либо из детей объекта игрушки, просто определите другой метод на 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 будет отображать значки " вкл " или "выкл", как и для логических полей. Обратите внимание, что этот подход требует одного запроса на одного родителя (т. е. O(n)). Вам нужно будет проверить, получите ли вы приемлемую производительность в производстве.