如何优雅地将单个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
相关产品推荐
相关产品推荐

