2015-05-26 4 views
1

У меня есть модель Flask/SQLAlchemy под названием Subscription, которая связана со многими другими моделями (подписчиками, платежами и т. Д.). Теперь мне нужно соединить две подписки, где одна подписка иногда называется «благодетелем» по отношению к другой подписке, называемой ее «получателем». Это необязательная индивидуальная реляционная модель.Flask/SQLAlchemy - синтаксис отношения один к одному

Когда я попробовать следующее:

class Base(db.Model): 
    __abstract__ = True 
    id = db.Column(db.Integer, primary_key=True) 

class Subscription(Base): 

    __tablename__ = 'subscriptions' 
    benefactor_id = db.Column(db.Integer, db.ForeignKey('subscriptions.id')) 
    recipient = relationship('Subscription', uselist=False, backref='benefactor') 

Я получаю ошибку:

Subscription.recipient and back-reference Subscription.benefactor are both 
of the same direction symbol('ONETOMANY'). Did you mean to set remote_side 
on the many-to-one side ? 

Это прекрасно работает только с определением benefactor_id, но перерывы на декларации отношения. Какие-либо предложения? Я не понимаю эту ошибку - из моего чтения документации, uselist = False должен предотвратить эту проблему.

ответ

0

Ошибка говорит о необходимости установить ключевое слово remote_side для отношений. Вы пытались настроить его так?

class Subscription(Base): 

__tablename__ = 'subscriptions' 
benefactor_id = db.Column(db.Integer, db.ForeignKey('subscriptions.id')) 
recipient= relationship(
    'Subscription', 
    uselist=False, 
    remote_side=[id], 
    backref='benefactor' 
) 
+0

кажется, что это поле не доступно для справки в этой точке, так как таблица самоссылающаяся: «AttributeError: объект„Таблица“не имеет атрибута„идентификатор“» – Joseph

+0

Вы не имеете идентификатора в таблице «Подписки»? –

+0

Я бы подумал, что должен использовать benefactor_id. У меня есть id в моем базовом классе: класс Base (db.Model): __abstract__ = True id = db.Column (db.Integer, primary_key = True) – Joseph

2

Хорошо, я понял это, но я не очень доволен решением.

Во-первых, я обнаружил, что мне пришлось повторять атрибут id как в базовом, так и в производном классах. Я не мог переместить его из базового класса, потому что на него ссылаются методы базового класса и многие другие производные классы, и в то же время я не мог ссылаться на объявление базового класса из производного класса и поэтому должен был повторно объявить его (у кого есть лучшее решение)? Надеюсь, я ничего не сломал в SQLAlchemy - по крайней мере, все мои тесты проходят, несмотря на то, как мало мне нравится это решение.

Во-вторых, чтобы сделать индивидуальную работу с самореферентным подключением, я объявила о связи, как показано ниже.

class Base(db.Model): 
    __abstract__ = True 
    id = db.Column(db.Integer, primary_key=True) 

class Subscription(Base): 
    __tablename__ = 'subscriptions' 
    id = db.Column(db.Integer, primary_key=True) 
    benefactor_id = db.Column(db.Integer, db.ForeignKey('subscriptions.id')) 
    recipient = relationship('Subscription', uselist=False, 
           backref=db.backref('benefactor', remote_side=id)) 
Смежные вопросы