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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 21:05:51