Вы забыли добавить имя таблицы:
"ВЫБЕРИТЕ местоположение ИЗ КНИГИ, где Book_Name = 'XYZ'"
Ваш инстинкт является правильным, что это не будет работать. В Django полномочия хранятся в базе данных, что означает что:
_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
. Если необходимо изменить полномочия динамично в основе времени выполнения на пользователе, Вы захотите обеспечить свой собственный бэкенд аутентификации.
Попробуйте использовать пользовательский менеджер:
#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')