Django同型号多表
我有一张巨大的桌子,需要切成一些较小的桌子,例如: 活动01,活动02。。。 在为同一模型使用不同表名的django queryset时,我只知道在模型上设置表名: 模型。_meta.db_table='tableXXX' 但是,这种方法不适用于单个shell/request。(只适用于第一次,但不适用于下一次)->可能是因为它仍在同一实例上? 第二次尝试设置_meta.db_table='tableYYY'后,将出现一个错误“django.db.utils.ProgrammingError:表“tableXXX”的子句条目中缺少” 我也尝试了一些我读过的关于这个问题答案的建议,比如:Django同型号多表,django,django-queryset,multiple-tables,Django,Django Queryset,Multiple Tables,我有一张巨大的桌子,需要切成一些较小的桌子,例如: 活动01,活动02。。。 在为同一模型使用不同表名的django queryset时,我只知道在模型上设置表名: 模型。_meta.db_table='tableXXX' 但是,这种方法不适用于单个shell/request。(只适用于第一次,但不适用于下一次)->可能是因为它仍在同一实例上? 第二次尝试设置_meta.db_table='tableYYY'后,将出现一个错误“django.db.utils.ProgrammingError:表
class ListingManager(models.Manager):
def get_custom_obj(self, table_name):
self.model._meta.db_table = table_name
return self
class ObjectName(models.Model):
objects = ListingManager()
尝试创建一个对象管理器来获取新对象,但它不起作用,它仍然会抛出与以前相同的错误(在第二次设置_meta.db_table时)
如果我们想为_meta.db_table设置多次,唯一可行的方法是首先退出()shell,然后重新进入shell模式(这意味着for循环不起作用)
我知道它可以通过原始查询“Insert into tableXXX values()”来实现,但是有什么方法可以使用django queryset来实现吗?谢谢~考虑创建一个包装器模型
class Model1(models.Model):
# fields...
name = ...
age = ...
class Model2(models.Model):
# fields...
height = ...
weight = ...
class ModelAll(models.Model):
model1 = models.OneToOneField(Model1)
model2 = models.OneToOneField(Model2)
但如果您只是为了组织而这样做,只需将字段用空格分隔开即可
这将导致以下表格:
模型1
id | name | age
------------------
1 | "Joe" | 21
模型2
id | height | weight
----------------------
1 | 5.85 | 175
2 | 6.0 | 210
模特儿
id | model1_id | model2_id
----------------------------
1 | 1 | 2
要访问子模型字段,请执行以下操作:
modelall = ModelAll.objects.get(...)
modelall_name = modelall.model1.name
modelall_height = modelall.model2.height
为什么需要拆分模型?如果是为了组织,只需将字段分成块,并用空格将它们分开。在这种情况下,ModelAll仍然非常庞大。我需要拆分表的原因是为了减少表的数量,因为如果将表放在一起,它将是非常巨大的数量。将表拆分为一些小表时,备份和表迁移可能非常容易。ModelAll实际上非常小。Model1和Model2将包含与其节对应的列。因此,如果Model1有name和age,Model2有height和weight作为字段,那么每个字段都将是一个只包含这些列的表。ModelAll将仅包含2个字段。。。一个整数是Model1的外键,一个整数是Model2的外键。它不会包含每个模型中的单个字段。我试图拆分的是,这些小表的每个字段都完全相同,例如:AllTable有字段“id,name,age,category”,然后我想将其拆分为SmallTableCategory1,其字段是“id,name,age”,然后是SmallTableCategory2,其字段是“id,name,age”。在这种情况下,这些smalltablecategoryX将比AllTable小得多。这就是它的作用。因此,将ModelAll替换为Person,将Model1替换为Category_Common,将Model2替换为Category_Size。Person由多个字段类别组成。每个子模型(在本例中为Model1和Model2)都包含字段组,但ModelAll将它们全部拉到一起。