Tôi tin rằng bạn có thể tạo một hàm gốc sẽ trả về mô hình của bạn với một động 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( ...
CHỈNH SỬA:Django không tạo một phiên bản mới của _meta
của lớp thuộc tính mỗi khi hàm này được gọi. Tạo một phiên bản mới cho _meta
nó phụ thuộc vào tên của lớp (Django phải lưu nó vào bộ nhớ cache ở đâu đó). Một siêu kính có thể được sử dụng để thay đổi tên của lớp trong thời gian chạy:
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
không chắc liệu nó có thể được đặt động trên một lớp đã được xác định hay không. Bản thân tôi chưa làm việc này nhưng nó có thể hoạt động.
Bạn có thể đặt điều này bất cứ khi nào.
>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()