单个Django模型,多个表?

exu*_*ero 27 python mysql django

我在MySQL数据库中有几个临时表,它们共享相同的模式并具有动态名称.我如何使用Django与这些表交互?单个模型可以从多个表中绘制数据吗?

Sky*_*and 25

我相信,您可以创建一个工厂函数,它将使用动态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( ...
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

不确定它是否可以在已经定义的类上动态设置.我自己没有这样做,但它可能会奏效.

你可以随时设置它.

>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()
Run Code Online (Sandbox Code Playgroud)


Chi*_*and 9

动态创建表的模型.

from django.db import models
from django.db.models.base import ModelBase

def create_model(db_table):

    class CustomMetaClass(ModelBase):
        def __new__(cls, name, bases, attrs):
            model = super(CustomMetaClass, cls).__new__(cls, name, bases, attrs)
            model._meta.db_table = db_table
            return model

    class CustomModel(models.Model):

        __metaclass__ = CustomMetaClass

        # define your fileds here
        srno = models.IntegerField(db_column='SRNO', primary_key=True)

    return CustomModel
Run Code Online (Sandbox Code Playgroud)

你可以开始查询数据库了.

In [6]: t = create_model('trial1')

In [7]: t._meta.db_table
Out[7]: 'trial1'

In [8]: t.objects.all()  # default db
Out[8]: [<CustomModel: CustomModel object>, '(remaining elements truncated)...']

In [9]: t.objects.using('test').all()  # test db
Out[9]: [<CustomModel: CustomModel object>, '(remaining elements truncated)...']
Run Code Online (Sandbox Code Playgroud)

  • 惊人的答案!但是这样的解决方案将如何处理数据库迁移、表创建和方案更新呢?是否可以使用现有表名列表来支持通常的 Django 方案升级? (3认同)