Итак, у меня есть два класса SQLAlchemy:
class Report(Base):
"""
Parent class.
"""
__tablename__ = 'report'
record_id = Column(Integer, primary_key=True)
contact = Column(String(30))
survey_date = Column(DateTime)
project = Column(String(100))
__mapper_args__ = {
'polymorphic_on': project,
}
class Survey(Report):
"""
Child class.
"""
__tablename__ = 'some_project_survey'
record_id = Column(Integer, ForeignKey('report.record_id'), primary_key=True)
form_status = Column(String(150))
form_comment = Column(String(500))
__mapper_args__ = {'polymorphic_identity': 'some_project'}
При определенных условиях новым объектам Survey могут быть назначены все поля для None.Поэтому таблица some_project_survey может содержать строки NULL (все поля имеют значение NULL, кроме record_id).И таких строк много.В таких случаях я решил создать только объекты отчета, а не объекты съемки.Проблема заключается в выборе объектов съемки из базы данных.Стандартный метод использует INNER JOIN, поэтому объекты отчета, для которых нет записей в таблице some_project_survey, не возвращаются.
Затем я решил использовать функцию with_polymorphic:
entity = with_polymorphic(Report, Survey)
pi = Survey.__mapper_args__['polymorphic_identity']
query = self.session.query(entity)
query = query.filter(entity.reply_project == pi)
result = query.all()
И это сработало.Но если объект существует в таблице отчета и не существует в таблице some_project_survey, этот метод возвращает объект с атрибутом report_id, равным None.
Существует ли правильный способ выбора объектов Survey в таких обстоятельствах?
ОБНОВЛЕНИЕ:
Текущий подход:
entity = with_polymorphic(Report, Survey)
pi = Survey.__mapper_args__['polymorphic_identity']
query = self.session.query(entity, Report.record_id)
query = query.filter(entity.reply_project == pi)
result = query.all()
records = []
for row in result:
row[0].record_id = row[1]
records.append(row[0])
return records