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

如何设计Django数据库架构,跟踪带数量的用户物品领取交互以支持分析报表?

Django库存领取交互数据建模与实现方案

核心模型设计

由于单次领取交互可能涉及多件物品,采用主从表结构存储数据,既符合数据库设计范式,也能覆盖所有分析需求:

1. 交互主表(Transaction)

记录每次领取操作的整体信息:

from django.db import models
from django.contrib.auth.models import User

class Transaction(models.Model):
    # 关联内置User模型,记录操作用户
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="transactions")
    # 自动记录交互发生时间
    timestamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"[{self.timestamp}] {self.user.username}的领取记录"

2. 交互明细(TransactionItem)

记录单次交互中每件物品的领取数量,关联主表和物品表:

class TransactionItem(models.Model):
    # 关联所属的交互主记录
    transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE, related_name="items")
    # 关联领取的物品
    item = models.ForeignKey("Item", on_delete=models.CASCADE, related_name="claim_records")
    # 领取数量
    quantity = models.PositiveIntegerField()

    def __str__(self):
        return f"{self.quantity}件{self.item.name}(记录ID:{self.transaction.id})"

分析需求对应查询实现

近期领取的物品(以近7天为例)

from django.utils import timezone

# 获取近7天的所有领取记录,预关联用户和物品数据减少查询次数
recent_claims = Transaction.objects.filter(
    timestamp__gte=timezone.now() - timezone.timedelta(days=7)
).select_related("user").prefetch_related("items__item")

最受欢迎的物品(按总领取量排序)

from django.db.models import Sum

# 给每个物品标注总领取量,按降序排列
popular_items = Item.objects.annotate(
    total_claimed=Sum("claim_records__quantity")
).order_by("-total_claimed")

特定用户的活动记录

# 通过User实例直接关联查询其所有领取记录
target_user = User.objects.get(username="target_user")
user_activities = target_user.transactions.prefetch_related("items__item").order_by("-timestamp")

按日期筛选交互记录

from datetime import date

# 筛选指定日期的所有领取记录
date_filtered_records = Transaction.objects.filter(
    timestamp__date=date(2024, 5, 20)
).prefetch_related("items__item")

每件物品的总领取数量

# 直接通过annotate统计每个物品的总领取量
item_total_claims = Item.objects.annotate(total_claimed=Sum("claim_records__quantity"))

完整交互历史

# 查询所有领取记录,按时间倒序排列,预关联相关数据
full_history = Transaction.objects.all().select_related("user").prefetch_related("items__item").order_by("-timestamp")

关键注意事项

  • 库存同步更新:每次领取操作完成后,必须同步减少对应Item的stock_quantity字段值,避免库存数据不一致
  • 自定义认证关联:由于你使用的是自定义代码验证逻辑,验证通过后要确保能正确匹配到User模型实例,再创建Transaction记录
  • 查询性能优化:统计类查询务必使用annotate、select_related和prefetch_related,减少数据库查询次数,提升页面加载速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:33:26