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

如何优雅地将单个Django模型拆分到多张数据库表中?

Django 模型字段拆分:按需加载多表字段

现在有大量文档讨论如何通过**concrete继承(多表继承)**让多个模型共享父类/表的字段,比如:

class Place(models.Model):
    ...

class Restaurant(Place):
    ...

但很少有资料涉及反向场景:把单个模型的字段拆分到多张表,避免非必要时加载大量冗余字段,从而节省性能开销。

设想的实现场景

我考虑了这样的拆分方式:

class Person_Profile(models.Model):
    ...lots of fields...

class Person_Preferences(models.Model):
    ...lots of fields...

class Person(Person_Profile, Person_Preferences):
    ...small set of core fields...

当前已实现的功能

  • 创建Person对象时,会自动创建并关联另外两个对象
  • 可以直接通过Person对象访问个人资料和偏好的字段(比如person.some_field)

待解决的问题

目前的核心痛点是无法优雅控制Django加载父表字段的时机:执行p = Person.objects.first()时,默认会关联查询所有三张表,无法按需仅加载核心字段。


更新

我研究了Django中选择字段子集的实现方式,找到了QuerySet的defer()和only()方法,还有一种用非托管模型作为门面来便捷加载字段子集的方案:

class Person(models.Model):
    name = models.CharField(max_length=30)
    pref1 = models.BooleanField(default=False)
    profile1 = models.CharField(max_length=30, null=True)

class SkinnyPerson(models.Model):
    name = models.CharField(max_length=30)

    class Meta:
        managed = False
        db_table = 'myapp_person'

目前还没最终确定方案,但这个非托管模型的思路看起来很有吸引力。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:51:49