[英]Single Django model, multiple tables?
我知道之前已經問過這個完全相同的問題,但我希望得到一個“更好”的答案(不涉及在運行時修改類屬性)。 這是個問題:
我有同樣的問題 - 我正在尋找一個類似於響應者的第一個回復的解決方案,但這確實有效。 如果沒有更好的解決方案,那么有人可以評論響應者解決方案的可靠性嗎? 在我看來,更改數據庫名稱和查詢數據庫之間的延遲可能最終從錯誤的表返回結果:
查詢1:更改名稱
查詢2:再次更改名稱
查詢1:獲取結果(但使用查詢2中的錯誤名稱)
編輯:該模型適用於~15個表 - 因此繼承是不切實際的,因為每次都需要一個新的模型名稱。
謝謝
PS如果這不是要求對問題進行詳細闡述的正確方法,我表示歉意。
對於動態表和數據庫可交換模型,其行為比鏈接問題中的行為更性感,您可以使用簡單的方法或屬性:
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
你可以試試這樣的......
復制部分是為了避免模型之間共享選項的危險。 我花了很長時間才找到解決方案的這一部分。 但對於其他人來說,它看起來既性感又直白。
當然,一旦你在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")
一個非常有用的片段。
from django.db import models
shard_tables = {}
class ShardMixin():
@classmethod
def shard(cls, id=None):
def get_ext(id): # the multi tables rule
return str(id % 100)
ext = get_ext(id)
_db_table = "%s%s" % (cls._meta.db_table , ext) # your table name
if _db_table not in shard_tables:
class Meta:
db_table = _db_table
attrs = {
'__module__': cls.__module__,
'Meta': Meta,
}
shard_tables[_db_table] = type("%s%s" % (cls.__name__, ext), (cls, ), attrs)
return shard_tables[_db_table]
class User(models.Model, ShardMixin):
username = models.CharField(max_length=255, verbose_name=" username")
class Meta:
abstract = True
db_table = "user_"
users = User.shard(id=3).objects.values()
print(users)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.