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
相关产品推荐
相关产品推荐

