如何设计包含某列已有行数据的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
相关产品推荐
相关产品推荐

