Динамический Meta приписывает для Django Models?

Вы забыли добавить имя таблицы:

"ВЫБЕРИТЕ местоположение ИЗ КНИГИ, где Book_Name = 'XYZ'"

9
задан user27478 7 April 2009 в 14:07
поделиться

2 ответа

Ваш инстинкт является правильным, что это не будет работать. В Django полномочия хранятся в базе данных, что означает что:

  • они должны быть доступными на уровне класса, когда syncdb выполняется для заполнения auth_permission таблицы (и подход требует экземпляра, который не будет сделан во время syncdb),
  • даже если Вы действительно добавляли его к _meta.permissions в __init__, User объект не взял бы его ни в каких вызовах проверки разрешения, потому что они консультируются с таблицей полномочий в DB (и кэш той таблицы в этом).

В чем Вы на самом деле нуждаетесь, вот метакласс... Ваша цель не может быть выполнена с помощью наследования. Метакласс переписывает Ваш ModelA и ModelB определения классов динамично, прежде чем они будут определены, таким образом это не требует a ModelA экземпляр, и доступен syncdb. Так как модели Django также используют метаклассы для создания Meta возразите во-первых, единственное требование - то, что Ваш метакласс должен наследоваться тому же метаклассу как модели Django. Вот некоторый пример кода:

from django.db.models.base import ModelBase

class CustomModelMetaClass(ModelBase):

    def __new__(cls, name, bases, attrs):
        klas = super(CustomModelMetaClass, cls).__new__(cls, name, bases, attrs)
        klas._meta.permissions.append(('view_' + klas._meta.module_name, u'Can view %s' % klas._meta.verbose_name))

        return klas

class ModelA(models.Model):

    __metaclass__ = CustomModelMetaClass

    test = models.CharField(max_length=5)

Обратите внимание, что полномочия в этом случае будут записаны только на syncdb. Если необходимо изменить полномочия динамично в основе времени выполнения на пользователе, Вы захотите обеспечить свой собственный бэкенд аутентификации.

25
ответ дан 4 December 2019 в 08:34
поделиться

Попробуйте использовать пользовательский менеджер:

#create a custom manager
class DynTableNameManager(models.Manager):
    #overwrite all() (example)
    #provide table_name
    def all(self, table_name):
        from django.db import connection
        cursor = connection.cursor()
        cursor.execute("""
            SELECT id, name
            FROM %s
            """ % table_name)
        result_list = []
        for row in cursor.fetchall():
            p = self.model(id=row[0], name=row[1])
            result_list.append(p)
        return result_list

#cerate a dummy table
class DummyTable(models.Model):
    name = models.CharField ( max_length = 200 )
    objects = DynTableNameManager()

используйте так:

f = DummyTable.objects.all('my_table_name')
0
ответ дан 4 December 2019 в 08:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: