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

Django如何获取并展示特定用户(2003-111)的ClearanceItem对象

问题:筛选并展示特定用户的ClearanceItem对象

背景信息

  • 使用自定义用户模型ClearanceCustomuser,以userid(字符类型)作为主键
  • ClearanceItem模型通过resolve_by外键关联到ClearanceCustomuser
  • 当前视图返回所有ClearanceItem条目,需要改为仅展示resolve_by对应userid=2003-111的用户的所有条目

现有数据示例

itemid      sy          sem  resolve_by
book    2021-2022    2    2003-111
table   2021-2022    1    2012-455

模型代码(models.py)

class ClearanceCustomuser(models.Model):
    password = models.CharField(max_length=128)
    last_login = models.DateTimeField(blank=True, null=True)
    is_superuser = models.BooleanField()
    userid = models.CharField(primary_key=True, max_length=9)
    email = models.CharField(unique=True, max_length=254)
    is_staff = models.BooleanField()
    is_active = models.BooleanField()
    date_joined = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'clearance_customuser'

class ClearanceItem(models.Model):
    itemid = models.CharField(primary_key=True, max_length=20)
    sem = models.CharField(max_length=1, blank=True, null=True)
    sy = models.CharField(max_length=9, blank=True, null=True)
    resolve_by = models.ForeignKey('ClearanceCustomuser', models.DO_NOTHING, 
    db_column='resolve_by', blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'clearance_item'

当前视图代码(views.py)

def index(request):
    context = {}
    context['items'] = ClearanceItem.objects.all()
    return render(request, 'clearance/index.html', context)

期望效果对应的SQL

select b.cl_itemid,b.sem,b.sy,b.resolve_by
from curriculum.clearance_customuser a
INNER JOIN curriculum.clearance_item b ON a.userid = b.resolve_by
where resolve_by = '2003-221'

解决方案

你可以通过Django ORM的筛选功能直接实现需求,以下两种方式都能达到目标:

方式一:直接外键字段筛选(简洁版)

利用ORM的双下划线字段查找,直接通过resolve_by__userid筛选目标用户的条目,逻辑和你提供的SQL完全等价:

def index(request):
    context = {}
    # 筛选resolve_by关联的userid为'2003-111'的ClearanceItem
    context['items'] = ClearanceItem.objects.filter(resolve_by__userid='2003-111')
    return render(request, 'clearance/index.html', context)

方式二:先获取用户实例再反向查询(严谨版)

如果需要处理用户不存在的情况,或者要用到该用户的其他信息,可以先获取用户对象,再通过反向关联查询其所有ClearanceItem:

def index(request):
    context = {}
    try:
        # 获取目标用户
        target_user = ClearanceCustomuser.objects.get(userid='2003-111')
        # 反向查询该用户关联的所有ClearanceItem
        context['items'] = target_user.clearanceitem_set.all()
    except ClearanceCustomuser.DoesNotExist:
        # 用户不存在时返回空列表
        context['items'] = ClearanceItem.objects.none()
    return render(request, 'clearance/index.html', context)

补充说明

  • 方式一无需额外处理用户存在性,ORM会自动生成关联查询的SQL,和你写的INNER JOIN逻辑一致
  • 方式二能避免用户不存在时的异常,适合需要做边界处理的场景
  • 如果需要动态获取当前登录用户的userid,可以替换为request.user.userid(前提是已配置好自定义用户认证)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 04:45:42