【问题标题】:Django 1.11 - Use Model to query a clone tableDjango 1.11 - 使用模型查询克隆表
【发布时间】:2019-04-24 06:41:29
【问题描述】:

我有一张桌子core_people 和一张备用桌子core_people_01

是否可以使用PeopleDjango模型对“克隆”表进行查询?

类似这样的:

People.objects.get(pk = 123).table("people_01")

我一直在网上搜索没有成功。

评论后更新

阅读关于 SO 的另一篇文章,我已经尝试过该解决方案。在我的模型文件中,我把这个方法:

def get_model(db_table):
  class MyClassMetaclass(People):
    def __new__(cls, name, bases, attrs):
      name += db_table
      return People.__new__(cls, name, bases, attrs)

  class MyClass(models.Model):
    __metaclass__ = MyClassMetaclass

    class Meta:
      db_table = db_table

  return MyClass

使用它:

backup_people = get_model("core_people_01")
print (backup_people .objects.get(pk = 1234))

Pylint 告诉我 MyClassMetaclass 作为 MetaClass 无效并尝试执行上述指令,python 告诉我:

RuntimeWarning:模型“myclassmetaclass.core”已注册。不建议重新加载模型,因为它会导致不一致,尤其是与相关模型不一致。

【问题讨论】:

标签: django


【解决方案1】:

如果您从同一个模型创建表,那么您可以访问模型的_meta 属性来指定您要使用的表名,如下所示。

People._meta.db_table = 'core_people_01'

People.objects.all() ```

【讨论】:

  • 它似乎工作。不幸的是,表名覆盖似乎是“永久的”并且不在使用的方法中,所以我需要在使用后恢复原始表名。
【解决方案2】:

如果这是一个永久性要求,我会通过以下方式使用模型继承:

1) 将您的人模型转换为抽象模型:

class AbstractPeople(models.Model):
    # Here your fields as in the original People model
    class Meta:
        abstract = True

2) 创建两个从AbstractPeople扩展的具体模型

class People(AbstractPeople):
    pass

class BackupPeople(AbstractPeople):
    class Meta:
        db_table = 'core_people_01'
        # You can include this if your table already exists 
        # and do not want Django to mess around with it
        managed = False

通过这种方式,两个模型具有相同的结构,但它们只是从不同的表中获取数据。

【讨论】:

  • 备份表与月份相关,因此有很多。如何实现 BackupPeople 动态更改表?
  • 这些表是不是太大了?您不能简单地制作一个视图,它是您所有备份表的联合视图,并将BackupPeople 模型与该视图相关联吗?然后,无论何时添加新的备份表(即每个月),您只需在视图定义中添加一个新的 UNION 子句。
  • 这个想法意味着更改 cron 批处理以删除并使用新表重新创建视图。这是一种可能。
  • 如果每月生成一次新表,那么您也可以每月添加一次新的BackupPeopleBackupPeople01BackupPeople02 等行中的东西。这当然不是很干净,但根据您的用例,它可能没问题。如果您想要更动态的东西,您应该深入研究如何将模型动态添加到已经运行的 django 实例中,但对于将来需要照顾您的应用程序的人来说,它可能会变得晦涩难懂。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2012-10-19
相关资源
最近更新 更多