Помогите ибо не нагуглить…
Хочется сделать так, что-бы существовала общая некая табличная схема. Которую расширяют классы с функциями, которые и являются в конечном счёте моделями.
Вероятно это выглядит так:
Схемы:
from sqlalchemy import (Column, Integer, Unicode, Text, ForeignKey)
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import (relationship, backref)
class IDB:
__table_args__ = {'mysql_engine':'InnoDB', 'mysql_collate': 'utf8_general_ci', 'extend_existing': True}
class PKID:
id = Column(Integer, primary_key=True)
class SUsers(IDB, PKID):
__tablename__ = 'users'
username = Column(Unicode(32), unique=True)
email = Column(Unicode(32), unique=True)
password = Column(Unicode(64))
created = Column(Integer)
activity = Column(Integer)
@declared_attr
def roles(cls):
return association_proxy('roles_users', 'roles')
@declared_attr
def profiles(cls):
return relationship("Profiles", uselist=False)
class SProfiles(IDB, PKID):
__tablename__ = 'profiles'
@declared_attr
def userid(cls):
return Column(Integer, ForeignKey('users.id'))
fullname = Column(Unicode(64))
avatar1 = Column(Unicode(32))
avatar2 = Column(Unicode(32))
avatar3 = Column(Unicode(32))
class SRoles(IDB, PKID):
__tablename__ = 'roles'
name = Column(Unicode(16))
rolesgroup = Column(Unicode(16))
description = Column(Unicode(255))
ordering = Column(Integer)
@declared_attr
def permissions(cls):
return association_proxy('perms_roles', 'permissions')
@declared_attr
def users(cls):
return association_proxy('roles_users', 'users')
import time
import datetime
from testproject.models import Base
from testproject.models.shemas import (SUsers, SProfiles, SRoles, SPermissions, SBlocks, SRolesUsers, SPermissionsRoles)
class Users(SUsers, Base):
def __init__(self, username, email, password, created, activity=None, profiles=None, roles=None):
self.username = username
self.email = email
self.password = password
self.created = created
if activity:
self.activity = activity
if profiles:
self.profiles = profiles
if roles:
self.roles = roles
def check_password(self, passwd):
return self.password == passwd
def datefromtimestamp(self, dateformat='%Y-%m-%d %H:%M:%S'):
return str(datetime.datetime.fromtimestamp(self.created).strftime(dateformat))
def activityparams(self, activitytime=300, classactiv='useract', classnoactiv='usernoact', dateformat='%Y-%m-%d %H:%M:%S'):
if (int(time.time()) - self.activity) <= activitytime:
p1 = classactiv
else:
p1 = classnoactiv
p2 = str(datetime.datetime.fromtimestamp(self.activity).strftime(dateformat))
return (p1, p2)
class Profiles(SProfiles, Base):
def __init__(self, fullname, register=None, lastlogin=None, expired=None, avatar1=None, avatar2=None, avatar3=None):
self.fullname = fullname
if avatar1:
self.avatar1 = avatar1
if avatar2:
self.avatar2 = avatar2
if avatar3:
self.avatar3 = avatar3
class Roles(SRoles, Base):
def __init__(self, name, rolesgroup, description=None, ordering=None):
self.name = name
self.rolesgroup = rolesgroup
if description:
self.description = description
if ordering:
self.ordering = ordering
def shortdesc(self, getsize=68):
if len(self.description) >= getsize:
return self.description[:getsize] + '...'
else:
return self.description
class Permissions(SPermissions, Base):
def __init__(self, permname, description=None, ordering=None):
self.permname = permname
if description:
self.description = description
if ordering:
self.ordering = ordering
def shortdesc(self, getsize=68):
if len(self.description) >= getsize:
return self.description[:getsize] + '...'
else:
return self.description
Предполагается, что для группу таких моделей хранить в каком то пакете. Например у меня это в пакете rbac. Внутри ещё несколько модулей, для функций:
from sqlalchemy import (desc, asc)
from testproject.models import DBSession
from . import Users, Roles
def get_user2(itemid):
return DBSession.query(Users).filter(Users.id == itemid).one()
def get_user(username):
user = DBSession.query(Users).filter(Users.username == username).all()
if user:
return user[0]
else:
return None
def add_user():
pass
#Удалить пользователей по списку
def delete_users(delitems):
try:
for e in delitems:
DBSession.query(Users).filter(Users.id == e).delete()
transaction.commit()
result = 1
except:
transaction.rollback()
result = 0
return result
def get_users(offset=None, limit=None):
if offset==None or limit==None:
return DBSession.query(Users).all()
else:
return (DBSession.query(Users).all())[offset:limit]
Всё бы хорошо, но мне нужно делать такую схему в каждом __init__.py Где я хочу писать свои функции для моделей.
Тогда возникает проблема, что называть их Users, Roles, Profiles уже не получается - Возникает ошибка.
В то время как и изменять имена классов например: Public_Comments_Users не получается - Возникают проблемы со связями между таблицами в схеме данных.
Как тут быть?