簡體   English   中英

單個Django模型,多個表?

[英]Single Django model, multiple tables?

我知道之前已經問過這個完全相同的問題,但我希望得到一個“更好”的答案(不涉及在運行時修改類屬性)。 這是個問題:

單個Django模型,多個表?

我有同樣的問題 - 我正在尋找一個類似於響應者的第一個回復的解決方案,但這確實有效。 如果沒有更好的解決方案,那么有人可以評論響應者解決方案的可靠性嗎? 在我看來,更改數據庫名稱和查詢數據庫之間的延遲可能最終從錯誤的表返回結果:

查詢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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM