не может получить отношения один ко многим, работающие в (Flask-) SQLAlchemy - PullRequest
0 голосов
/ 01 июня 2018

У меня есть несколько классов:

import uuid
from app import db, create_app
from sqlalchemy.sql import func
from sqlalchemy.dialects.postgresql import UUID, ARRAY, JSONB

class Ticket(db.Model):
    __tablename__ = 'tickets'
    id = db.Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    time = db.Column(db.DateTime, server_default=func.now(), index=True)
    proposed_names = db.Column(ARRAY(db.String))
    measurements = db.relationship('TempMeasurement', back_populates='ticket')

class BaseMeasurement(object):
    id = db.Column(db.Integer, primary_key=True)

    @declared_attr
    def type_id(self):
        return db.Column(db.Integer, db.ForeignKey('optical_data_types.id'))

    @declared_attr
    def type(self):
        return db.relationship('OpticalDataType')

    @declared_attr
    def operator_id(self):
        return db.Column(db.Integer, db.ForeignKey('operators.id'))

    @declared_attr
    def operator(self):
        return db.relationship('Operator')

    @declared_attr
    def item_id(self):
        return db.Column(db.String, db.ForeignKey('items.serial'))

    @declared_attr
    def item(self):
        return db.relationship('Item')

    time = db.Column(db.DateTime, index=True)
    instrument = db.Column(db.String)
    instrument_sn = db.Column(db.String)
    data = db.Column(JSONB)

class TempMeasurement(db.Model, BaseMeasurement):
    __tablename__ = 'ticket_data'
    id = db.Column(db.Integer, primary_key=True)
    ticket_id = db.Column(UUID(as_uuid=True), db.ForeignKey('tickets.id'), index=True)
    ticket = db.relationship('Ticket', back_populates='measurements')
    original_paths = db.Column(ARRAY(db.String))

Что я хочу / ожидаю, так это то, что я могу создать Ticket с несколькими дочерними TempMeasurements и зафиксировать это в базе данных.Что-то вроде:

app = create_app()

with app.app_context():
    ticket = Ticket()
    ticket.measurements = [TempMeasurement(...)]
    db.session.add(ticket)   # <-- error on this line
    db.session.commit()

Однако в SQLAlchemy я получаю непонятную ошибку:

AttributeError: 'str' object has no attribute '_sa_instance_state'

с полным следом здесь .

Я подумал, что это может быть из-за того, что столбец UUID ticket_id имеет as_uuid, поэтому я сделал его просто UUID (неявно str), но это не решило мою проблему.

Ошибка слишком глубока вSQLAlchemy для меня, чтобы понять - кто-нибудь может помочь?

...