Вложенная схема колба-зефир не применяется - PullRequest
1 голос
/ 21 июня 2019

В настоящее время я делаю API с запросом get, чтобы вернуть объединенные данные json для 2 моделей, которые имеют взаимосвязь с использованием flask, sqlalchemy и flask-sqlalchemy (для запроса) и flask-marshmallow (для сериализации в JSON)

Мои модели:

class Recording(Base):
    __tablename__ = 'recordings'

    id = Column(Integer, primary_key=True)
    filepath = Column(String, nullable=False)

    language_id = Column(Integer, ForeignKey('languages.id'), nullable=False)
    language = relationship("Language", back_populates="recordings")

    user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
    user = relationship("User", back_populates="recordings")

    created_at = Column(DateTime, nullable=False, default=func.now())
    updated_at = Column(DateTime, nullable=False,
                        default=func.now(), onupdate=func.now())
    deletedd_at = Column(DateTime, nullable=True)

    def __repr__(self):
        return 'id: {}'.format(self.id)

User.recordings = relationship("Recording", order_by=Recording.id, back_populates="user")
Language.recordings = relationship("Recording", order_by=Recording.id, back_populates="language")


class RecordingResult(Base):
    __tablename__ = 'recording_results'

    id = Column(Integer, primary_key=True)
    is_with_dictionary = Column(Boolean, default=False)
    result = Column(String, nullable=True)
    run_time = Column(Float, default=0.0)

    recording_id = Column(Integer, ForeignKey('recordings.id'), nullable=False)
    recording = relationship("Recording", back_populates="recording_results", lazy="joined")

    speech_service_id = Column(Integer, ForeignKey('speech_services.id'), nullable=False)
    speech_service = relationship("SpeechService", back_populates="recording_results")

    created_at = Column(DateTime, nullable=False, default=func.now())
    updated_at = Column(DateTime, nullable=False,
                        default=func.now(), onupdate=func.now())
    deletedd_at = Column(DateTime, nullable=True)

    def __repr__(self):
        return 'id: {}'.format(self.id)

Recording.recording_results = relationship("RecordingResult", order_by=RecordingResult.id, back_populates="recording", lazy="joined")
SpeechService.recording_results = relationship("RecordingResult", order_by=RecordingResult.id, back_populates="speech_service")

Мои схемы:

class RecordingResultItemSchema(ma.Schema):
    class Meta:
        model = RecordingResult
        fields = ('id', 'is_with_dictionary', 'result', 'run_time', 'recording_id', 'speech_service_id')

class RecordingItemSchema(ma.Schema):
    class Meta:
        model = Recording
        fields = ('id', 'filepath', 'language_id', 'user_id', 'recording_results')  
    recording_results = ma.Nested(RecordingResultItemSchema)
recording_item_schema = RecordingItemSchema()
recording_items_schema = RecordingItemSchema(many=True)
recording_result_item_schema = RecordingResultItemSchema()
recording_result_items_schema = RecordingResultItemSchema(many=True)

Модель записи имеет много RecordingResult (внешний ключ - record_id)

И я использовал этозапрос в API, используя 'lazy' из sqlalchemy, чтобы получить объединенные данные 2 моделей:

@app.route('/recording', methods=['GET'])
def get_recording_item():
    if db.session.query(Recording).options(joinedload(Recording.recording_results)).all():
        recording_list = db.session.query(Recording).options(joinedload(Recording.recording_results)).all()
        result = recording_items_schema.dump(recording_list)
        return jsonify(result.data), 200
    else:
        return jsonify(msg="Object not found"), 400

После отправки запроса через почтальона я получил это сообщение об ошибке:

AttributeError: "recording_id"не является допустимым полем для [id: 1].// Werkzeug Debugger

И в консоли я получил эту ошибку:

'"{0}" не является допустимым полем для формата {1}.'.(ключ, объект)) app_1
|AttributeError: «recording_id» не является допустимым полем для [id: 1].

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

1 Ответ

0 голосов
/ 24 июня 2019

Я изменил схему на:

class RecordingResultItemSchema(ma.Schema):
    class Meta:
        model = RecordingResult
        fields = ('id', 'is_with_dictionary', 'result', 'run_time', 'recording_id', 'speech_service_id')

class RecordingItemSchema(ma.Schema):
    class Meta:
        model = Recording
        fields = ('id', 'filepath', 'language_id', 'user_id', 'recording_results')  
    recording_results = ma.Nested(RecordingResultItemSchema, many=True) 

и теперь это сработало, потому что я не поместил параметр many = True в

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...