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

如何设计包含某列已有行数据的Django Model?

Django Model设计:处理行数据转字段的方案

针对你遇到的表格行数据(店铺/场所数量、老虎机数量、总价值)需要纳入Model的问题,提供两种实用方案:

方案一:扁平化字段设计(适合结构固定场景)

直接将表格中的每个行项作为独立字段,搭配对应的税相关字段,结构直观,查询便捷:

from django.db import models

class GamingDeviceTax(models.Model):
    # 店铺/场所数量相关字段
    venue_count = models.IntegerField(verbose_name="店铺/场所数量")
    venue_count_ggr_tax = models.DecimalField(
        max_digits=10, decimal_places=2, blank=True, null=True,
        verbose_name="店铺/场所数量GGR税"
    )
    venue_count_tax_rate = models.DecimalField(
        max_digits=5, decimal_places=2, blank=True, null=True,
        verbose_name="店铺/场所数量税率"
    )
    
    # 老虎机数量相关字段
    slot_machine_count = models.IntegerField(verbose_name="老虎机数量")
    slot_machine_ggr_tax = models.DecimalField(
        max_digits=10, decimal_places=2, blank=True, null=True,
        verbose_name="老虎机数量GGR税"
    )
    slot_machine_tax_rate = models.DecimalField(
        max_digits=5, decimal_places=2, blank=True, null=True,
        verbose_name="老虎机数量税率"
    )
    
    # 总价值相关字段
    total_value = models.DecimalField(
        max_digits=15, decimal_places=2, verbose_name="总价值"
    )
    total_value_ggr_tax = models.DecimalField(
        max_digits=10, decimal_places=2, blank=True, null=True,
        verbose_name="总价值GGR税"
    )
    total_value_tax_rate = models.DecimalField(
        max_digits=5, decimal_places=2, blank=True, null=True,
        verbose_name="总价值税率"
    )
    
    class Meta:
        verbose_name = "游戏设备税务信息"
        verbose_name_plural = verbose_name

优点:字段对应清晰,ORM查询无需关联,性能好;缺点:后续新增设备类型需修改Model并执行数据库迁移。

方案二:关联Model键值对设计(适合扩展性强场景)

如果后续可能新增更多设备类型,采用主表(设备类型)+子表(税务条目)的结构,无需修改Model即可扩展:

from django.db import models

class GamingDeviceCategory(models.Model):
    name = models.CharField(max_length=50, verbose_name="设备类型名称")
    
    class Meta:
        verbose_name = "游戏设备类型"
        verbose_name_plural = verbose_name
    
    def __str__(self):
        return self.name

class GamingDeviceTaxEntry(models.Model):
    category = models.ForeignKey(
        GamingDeviceCategory, on_delete=models.CASCADE,
        verbose_name="设备类型"
    )
    value = models.CharField(max_length=100, verbose_name="数值")  # 根据实际数据类型调整为Integer/DecimalField
    ggr_tax = models.DecimalField(
        max_digits=10, decimal_places=2, blank=True, null=True,
        verbose_name="GGR税"
    )
    tax_rate = models.DecimalField(
        max_digits=5, decimal_places=2, blank=True, null=True,
        verbose_name="税率"
    )
    
    class Meta:
        verbose_name = "游戏设备税务条目"
        verbose_name_plural = verbose_name

使用时先在GamingDeviceCategory中添加“店铺/场所数量”“老虎机数量”“总价值”这些类型,后续新增类型直接添加分类记录即可。

优点:扩展性强,无需修改Model;缺点:查询时需关联表,复杂场景下需额外处理数据聚合。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:05:18