Django admin列表中无外键关联模型如何实现对象关联跳转
Django Admin 无外键模型关联跳转实现方案
不需要修改现有模型加外键,通过Admin自定义方法+URL参数过滤即可实现需求,步骤如下:
1. 配置SessionUser的Admin类,支持URL参数过滤
首先给SessionUser的Admin重写查询集方法,允许通过URL携带的username参数过滤对应会话记录,代码写到对应app的admin.py中:
from django.contrib import admin from .models import User, SessionUser class SessionUserAdmin(admin.ModelAdmin): list_display = ('username', 'last_login') def get_queryset(self, request): qs = super().get_queryset(request) # 从URL参数取username做过滤 target_username = request.GET.get('username') if target_username: qs = qs.filter(username=target_username) return qs admin.site.register(SessionUser, SessionUserAdmin)
2. 自定义UserAdmin,添加会话跳转链接
在User的Admin配置中新增自定义只读字段,拼接跳转到SessionUser列表的带参地址,直接渲染为可点击链接:
from django.urls import reverse from django.utils.safestring import mark_safe class UserAdmin(admin.ModelAdmin): # 列表页也可以直接展示跳转入口 list_display = ('username', 'email', 'session_link') # 详情页将跳转链接设为只读字段展示 readonly_fields = ('session_link',) fields = ('username', 'email', 'password', 'session_link') def session_link(self, obj): # 反向解析SessionUser的admin列表地址,注意替换成你自己的app名 list_url = reverse('admin:your_app_name_sessionuser_changelist') + f'?username={obj.username}' return mark_safe(f'<a href="{list_url}">查看该用户全部登录会话</a>') session_link.short_description = '登录会话记录' admin.site.register(User, UserAdmin)
注意事项
- 代码中
your_app_name需要替换成模型所在App的实际名称,否则反向解析URL会报错 - 该方案完全基于共有
username字段做匹配,不需要修改原有模型结构,无额外迁移成本 - 如果追求更高的数据一致性和查询性能,长期建议给
SessionUser模型新增指向User的外键字段,加数据库索引,避免同username用户数据混淆的问题
内容的提问来源于stack exchange,提问作者rkk
相关产品推荐
相关产品推荐

