在Django(SQLite)中按Referall Code分组获取所有关联对象的方法
问题(中文翻译)
假设我有如下数据库表:
id 推荐码(Referall Code) 用户(User) 邮箱(Email) 使用日期(Date of Using) ______________________________________________________________________ 1 ABCD John john@email.com 13-06-2022 2 EFGH Marry marry@email.com 17-06-2022 3 IJKL Bryan bryan@email.com 21-06-2022 4 ABCD Luke luke@email.com 05-07-2022 5 EFGH Tom tom@email.com 11-08-2022
我希望得到如下格式的结果:
推荐码(Referall Code) 用户(User) 邮箱(Email) 使用日期(Date of Using) _______________________________________________________________ ABCD John john@email.com 13-06-2022 Luke luke@email.com 05-07-2022 EFGH Marry marry@email.com 17-06-2022 Tom tom@email.com 11-08-2022 IJKL Bryan bryan@email.com 21-06-2022
我使用SQLite作为数据库,请问如何在Django中实现该需求?
实现方案
这种同推荐码仅首行显示、其余行留白的格式,属于前端/视图层的渲染逻辑,数据库只会返回结构化的行数据,核心思路是先按推荐码排序,再通过模板或视图分组处理显示规则。
步骤1:定义Django模型
先确保模型和数据库表字段对应(假设表名为referral_usage):
# models.py from django.db import models class ReferralUsage(models.Model): referral_code = models.CharField(max_length=10, db_column='Referall Code') user = models.CharField(max_length=50, db_column='User') email = models.EmailField(db_column='Email') date_of_using = models.DateField(db_column='Date of Using') class Meta: db_table = 'referral_usage' # 替换为你的实际表名 ordering = ['referral_code', 'date_of_using'] # 按推荐码、使用日期排序
方式一:视图层分组后传给前端渲染
适合需要在后端对数据做额外处理的场景:
# views.py from django.shortcuts import render from .models import ReferralUsage def referral_list(request): # 取出排序后的所有数据 usages = ReferralUsage.objects.all() # 按推荐码分组 grouped_data = {} for usage in usages: if usage.referral_code not in grouped_data: grouped_data[usage.referral_code] = [] grouped_data[usage.referral_code].append(usage) # 转成有序列表(保证推荐码排序) sorted_groups = sorted(grouped_data.items(), key=lambda x: x[0]) return render(request, 'referral_list.html', {'sorted_groups': sorted_groups})
前端模板渲染(关键逻辑:同组仅首行显示推荐码):
<!-- referral_list.html --> <table border="1"> <thead> <tr> <th>推荐码</th> <th>用户</th> <th>邮箱</th> <th>使用日期</th> </tr> </thead> <tbody> {% for code, usages in sorted_groups %} {% for usage in usages %} <tr> <td>{% if forloop.first %}{{ code }}{% endif %}</td> <td>{{ usage.user }}</td> <td>{{ usage.email }}</td> <td>{{ usage.date_of_using|date:"d-m-Y" }}</td> </tr> {% endfor %} {% endfor %} </tbody> </table>
方式二:纯前端模板处理(更简洁)
直接传排序后的数据集,用Django模板标签{% ifchanged %}判断是否显示推荐码:
# views.py from django.shortcuts import render from .models import ReferralUsage def referral_list(request): usages = ReferralUsage.objects.all() return render(request, 'referral_list.html', {'usages': usages})
前端模板代码:
<!-- referral_list.html --> <table border="1"> <thead> <tr> <th>推荐码</th> <th>用户</th> <th>邮箱</th> <th>使用日期</th> </tr> </thead> <tbody> {% for usage in usages %} <tr> <td>{% ifchanged usage.referral_code %}{{ usage.referral_code }}{% endifchanged %}</td> <td>{{ usage.user }}</td> <td>{{ usage.email }}</td> <td>{{ usage.date_of_using|date:"d-m-Y" }}</td> </tr> {% endfor %} </tbody> </table>
注意事项
- SQLite不影响逻辑实现,核心是Django ORM的排序和模板渲染,和数据库类型无关。
- 如果数据库字段名包含空格,必须通过
db_column指定对应关系。 - 日期格式可通过
date模板过滤器调整,确保和需求一致。
内容的提问来源于stack exchange,提问作者Eddy Hartono
相关产品推荐
相关产品推荐

