单个Django模型,多个表? [英] Single Django model, multiple tables?

查看:193
本文介绍了单个Django模型,多个表?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在MySQL数据库中有几个临时表,共享相同的模式并具有动态名称。我如何使用Django与这些表进行接口?单个模型可以从多个表格中绘制数据?

解决方案

我相信,您可以制作一个返回模型的工厂函数动态 db_table

  def getModel(db_table):
class MyClass(models.Model):
#像往常一样定义
class Meta:
db_table = db_table

返回MyClass

newClass = getModel('29345794_table')
newClass.objects.filter(...

编辑:Django不会创建类的新实例 _meta 属性每次调用此函数时,为 _meta 创建一个新实例,它取决于类的名称(Django必须在某处缓存),可以使用元类在运行时更改类的名称:

  def getModel(db_table):
class MyClassMetacla ss(models.base.ModelBase):
def __new __(cls,name,bases,attrs):
name + = db_table
return models.base.ModelBase .__ new __(cls,name, base,attrs)

class MyClass(models.Model):
__metaclass__ = MyClassMetaclass

class Meta:
db_table = db_table

返回MyClass

不知道是否可以在已定义的动态类。我没有这样做,但它可能会工作。



您可以随时设置。

 >>> MyModel._meta.db_table ='10293847_table'
>>> MyModel.objects.all()


I have several temporary tables in a MySQL database that share the same schema and have dynamic names. How would I use Django to interface with those tables? Can a single model draw data from multiple tables?

解决方案

You could, I believe, make a factory function that would return your model with a dynamic db_table.

def getModel(db_table):
  class MyClass(models.Model):
     # define as usual ...
     class Meta:
       db_table = db_table

  return MyClass

newClass = getModel('29345794_table')
newClass.objects.filter( ...

EDIT: Django does not create a new instance of the class's _meta attribute each time this function is called. Creating a new instance for _meta it is dependent upon the name of the class (Django must cache it somewhere). A metaclass can be used to change the name of the class at runtime:

def getModel(db_table):
  class MyClassMetaclass(models.base.ModelBase):
    def __new__(cls, name, bases, attrs):
      name += db_table
      return models.base.ModelBase.__new__(cls, name, bases, attrs)

  class MyClass(models.Model):
    __metaclass__ = MyClassMetaclass

    class Meta:
      db_table = db_table

  return MyClass

not sure if it can be set dynamically on an already-defined class. I haven't done this myself but it might work.

You can set this whenever.

>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()

这篇关于单个Django模型,多个表?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆