【发布时间】:2014-06-21 00:35:13
【问题描述】:
我一直在尝试找出基于不同但相同的模型自动创建多个 SQL 表的最佳方法,这些模型都基于相同的基类。我基本上是在创建具有不同组的伪留言板或墙,我希望每个组都有自己的帖子 db_table,每个帖子都包含用户 ID、时间戳等。
我的第一个想法是拥有一个 Posts 基类并只包含一个组名称字段,但我认为这是不好的做法。我的理由是,包含所有组的每个帖子的一张表会变得非常大(无论如何理论上)并减慢过滤速度,而且从长远来看,组名称的额外字段会浪费内存,因为我可以分开每组表并跳过此字段。
我也考虑过使用具有多对一关系的 ForeignKey,但据我所知,这具有相同的缺点。我这样想有错吗?或者这些尺寸问题真的不是问题吗?
所以我的下一个想法是让 Posts 成为一个抽象类,然后根据每个 Group 创建子类。这就是我最终所做的。但是,我发现自己不得不一遍又一遍地复制和粘贴代码,并且每次都更改类名。这对我来说感觉非常不合 Python。是这样的:
class Posts(models.Model):
timestamp = models.DateTimeField(auto_now_add=True, unique=False)
user_id = ...
#etc.
#
class Meta:
abstract = True
class GroupA(Posts):
class Meta(Posts.Meta):
db_table = 'groupa_board'
class GroupB(Posts):
class Meta(Posts.Meta):
db_table = 'groupb_board'
class GroupC...etc.
我真正想要的是一个工厂函数来为我做这件事。我试过这样的事情:
def makeBoard(group):
class Board(Posts):
class Meta(Posts.Meta):
db_table = group
return board #note I tried with and without this line
然后我使用组列表运行了一个简单的 for 循环。
for group in groups:
makeBoard(group)
我发现自己遇到了运行时错误:应用程序中的模型冲突,这可能是我应得的。所以我想我需要的是这样的:
def makeBoard(group):
class group(Posts): #***group here being a variable, not the class name
class Meta(Posts.Meta):
db_table = '%s' % group #maybe issues here too, but the table
return group #name is not that important if the class
#name works
但我不知道如何进行这项工作!有没有办法将变量从列表传递到类名?
无论如何,如果你还在我身边,我很感激。我整天都在使用stackoverflow,虽然我找到了创建抽象基类和子类以解决类似问题的指南,但我没有看到一种方法来创建一个函数来为我做这件事。我最终选择了这里,只是手动为每个组创建了一个子类。如果有办法自动化这个过程,我很想听听。
另外,如果我不只是使用一个包含每个帖子的数据库表而变得愚蠢,我也想知道这一点,以及为什么!或者,如果有更好的方法来完全实现这种系统。抱歉,如果之前已经回答过,我真的找不到。
谢谢!
【问题讨论】: