Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Pojedynczy model Django, wiele stołów?

Uważam, że możesz stworzyć funkcję fabryczną, która zwróci model z dynamicznym 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( ...

EDYCJA:Django nie tworzy nowej instancji _meta klasy atrybut przy każdym wywołaniu tej funkcji. Tworzenie nowej instancji dla _meta zależy to od nazwy klasy (Django musi ją gdzieś zapisać w pamięci podręcznej). Metaklasa może służyć do zmiany nazwy klasy w czasie wykonywania:

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

nie jestem pewien, czy można go ustawić dynamicznie na już zdefiniowanej klasie. Sam tego nie robiłem, ale to może zadziałać.

Możesz to ustawić w dowolnym momencie.

>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. uzgadnianie stref czasowych z SQL

  2. Jak naprawić błąd połączenia z bazą danych MySQL JDBC 08001?

  3. Transpozycja wierszy na kolumny w MySQL

  4. Wstawianie do tabeli mysql i nadpisywanie wszelkich bieżących danych

  5. Baza danych:najlepszy sposób wyszukiwania danych o lokalizacji geograficznej?