2013-07-16 3 views
6

Я знаю, что подобные вопросы заданы, однако я действительно пытаюсь понять, как генерируются общие поля в SQLAlchemy.SQLAlchemy Generic Relationship простой пример

У меня есть класс/таблица разрешений, который я хочу содержать поле, которое может относиться к любому типу модели.

Я посмотрел на примерах и в этом блоге http://techspot.zzzeek.org/2007/05/29/polymorphic-associations-with-sqlalchemy/

Можно ли иметь общие отношения без отдельной таблицы? Просто сохраняя object_type и id? Что-то в этих строках:

class Permission(AbstractBase): 
    user = relationship("User", backref=backref('permissions')) 
    permission_type = column(String()) 
    object = #The object the permission applies to, could be any type. 

Я думаю, что просто очень простой пример будет оценен!

Кроме того, стоит отметить, что я исхожу из фона Django!

Благодаря

+0

Что значит «без другого стола»? Можете ли вы лучше определить, как выглядит ваша схема SQL? –

+0

Извините, я должен был сделать себя яснее. Без другой таблицы я имел в виду наличие отдельной таблицы для хранения родового отношения. – Charlie

+1

Это старое сообщение в блоге с более старыми шаблонами в нем, но первый пример, «как это делают рельсы», также является подходом django - он отказывается от использования традиционных внешних ключей, чтобы обойти необходимость в дополнительной таблице. но почему так важно правильно строить схему, чтобы сохранить таблицу? – zzzeek

ответ

1

Кто-то спросили идентичный вопрос о дне позже, я указал на трех примеры мы имеем для такого рода вещей, но я написал новый пример, который будет делать (в основном) то же самое Джанго (минус та странная таблица «contenttypes»): sqlalchemy generic foreign key (like in django ORM)

+0

Это фантастика, спасибо. – Charlie

5

Вы также можете использовать generic_relationship из пакета sqlalchemy-utils.

Адрес example for their documentation;

from sqlalchemy_utils import generic_relationship 

class User(Base): 
    __tablename__ = 'user' 
    id = sa.Column(sa.Integer, primary_key=True) 

class Customer(Base): 
    __tablename__ = 'customer' 
    id = sa.Column(sa.Integer, primary_key=True) 

class Event(Base): 
    __tablename__ = 'event' 
    id = sa.Column(sa.Integer, primary_key=True) 
    object_type = sa.Column(sa.Unicode(255)) 
    object_id = sa.Column(sa.Integer) 
    object = generic_relationship(object_type, object_id) 
Смежные вопросы