You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django Admin:如何将间接关联的UserDevice作为Inline显示在User页面

解决Django Admin中User详情页显示UserDevice Inline的问题

问题原因

Django Admin默认要求Inline关联的子模型必须直接拥有指向父模型的ForeignKey字段,但你的UserDevice仅通过AuthToken间接关联User,因此触发admin.E202错误。

解决方案:自定义Inline类

通过重写Inline的核心方法,实现间接关联的查询与显示,无需修改现有模型结构:

1. 编写自定义Inline代码

在项目的admin.py中添加以下内容:

from django.contrib import admin
from .models import User, AuthToken, UserDevice

class UserDeviceInline(admin.TabularInline):
    model = UserDevice
    extra = 0  # 控制默认显示的空表单数量,按需调整

    def get_queryset(self, request):
        # 过滤出当前User关联的所有UserDevice
        qs = super().get_queryset(request)
        if self.instance:
            auth_token_ids = self.instance.auth_token_set.values_list('pk', flat=True)
            qs = qs.filter(token_id__in=auth_token_ids)
        return qs

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        # 添加新设备时,限制token选项仅显示当前用户的AuthToken
        if db_field.name == 'token' and hasattr(self, 'instance') and self.instance:
            kwargs['queryset'] = AuthToken.objects.filter(user=self.instance)
        return super().formfield_for_foreignkey(db_field, request, **kwargs)

# 注册User模型并关联Inline
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    inlines = [UserDeviceInline]

2. 关键逻辑说明

  • get_queryset:通过当前User关联的AuthToken集合,过滤出对应的UserDevice数据,确保详情页只显示当前用户的设备。
  • formfield_for_foreignkey:在新增设备时,限制token下拉框仅展示当前用户的AuthToken,避免关联到其他用户的令牌。

3. 可选方案:修改模型添加直接关联

如果允许调整模型结构,可以给UserDevice新增一个直接指向User的外键字段:

class UserDevice(models.Model):
    token = models.OneToOneField(AuthToken, on_delete=models.CASCADE, related_name="auth_token")
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_devices")  # 新增字段
    # 其余字段保持不变

添加后执行数据库迁移:

python manage.py makemigrations
python manage.py migrate

完成后即可使用普通的TabularInline或StackedInline,无需自定义方法。

内容的提问来源于stack exchange,提问作者Ajay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 07:03:22