单个Django模型,多个表?

use*_*085 7 python django django-models

我知道之前已经问过这个完全相同的问题,但我希望得到一个"更好"的答案(不涉及在运行时修改类属性).这是个问题:

单个Django模型,多个表?

我有同样的问题 - 我正在寻找类似于响应者的第一个回复的解决方案,但这确实有效.如果没有更好的解决方案,那么有人可以评论响应者解决方案的可靠性吗?在我看来,更改数据库名称和查询数据库之间的延迟可能最终从错误的表返回结果:

查询1:更改名称

查询2:再次更改名称

查询1:获取结果(但使用查询2中的错误名称)

编辑:该模型适用于~15个表 - 因此继承是不切实际的,因为每次都需要一个新的模型名称.

谢谢

PS如果这不是要求对问题进行详细阐述的正确方法,我表示歉意.

chr*_*e31 2

对于比链接问题中的行为更性感的动态表和数据库可互换模型,您可以使用简单的方法或属性:

import copy

class MyModel(models.Model):
    # anything
    @property
    def table_name(self):
        return self._meta.db_table

    @table_name.setter
    def table_name(self, value):
        new_meta = copy.copy(self._meta)
        new_meta.db_table = value
        self._meta = new_meta

    @classmethod
    def set_qs_for_table(cls, qs, table):
        my_class = copy.copy(cls)
        my_options = copy.copy(my_class._meta)
        my_class._meta = my_options
        qs.model = my_class
Run Code Online (Sandbox Code Playgroud)

你可以尝试这样的事情......

复制部分是为了避免模型之间共享选项的危险。我花了一些时间才找到这部分的解决方案。但对于其他方面来说,它看起来性感而简单。

当然,一旦在 python 代码中你可以使用

qs = MyClass.objects.all()
MyClass.set_qs_for_table(qs, "this_table")
my_instance = qs[0]
my_instance.table_name = "that_table"
my_instance.save(using="this_db")
Run Code Online (Sandbox Code Playgroud)