Фильтр запросов SQLAlchemy по значению поля в связанной таблице - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь получить устройства, тип которых не 'TYPE_BLADE_SERVER'.Пожалуйста, помогите написать запрос.Мое решение, которое я пробую:

result = Device.query.filter(DeviceGroup.type != ModelType.TYPE_BLADE_SERVER).all()

, которое не фильтрует device_group таблицу, потому что device_group переименовано в device_group_1.Запрос Sql из sqlalchemy:

SELECT * FROM device_group, device
LEFT OUTER JOIN device_model AS device_model_1 ON device_model_1.id = device.model_id
LEFT OUTER JOIN device_group AS device_group_1 ON device_group_1.id = device_model_1.group_id 
WHERE device_group.type != % (type_1)s ; {'type_1': 'TYPE_BLADE_SERVER'}

Рабочее решение, но как и sql hardcode:

result = Device.query.filter(text("device_group_1.type <> 'TYPE_BLADE_SERVER'")).all()

Мои модели:

class Device(db.Model):
    __tablename__ = 'device'

    id = db.Column(db.Integer, primary_key=True)
    hostname = db.Column(db.String, index=True)
    model_id = db.Column(db.ForeignKey('device_model.id'), nullable=True)
    model = db.relationship("DeviceModel", backref='devices', lazy='joined')

class DeviceModel(db.Model):
   __tablename__ = 'device_model'

   id = db.Column(db.Integer, primary_key=True)
   group_id = db.Column(db.ForeignKey('device_group.id', ondelete='SET NULL'), nullable=True)

class DeviceGroup(db.Model):
    __tablename__ = 'device_group'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String, nullable=False, unique=True)
    height = db.Column(db.Integer, nullable=False)
    models = db.relationship("DeviceModel", backref=backref("group", lazy="joined"), lazy='joined')
    type = db.Column(sa.Enum(ModelType), nullable=False)

class ModelType(enum.Enum):
    TYPE_BLADE_SERVER = 'TYPE_BLADE_SERVER'
    TYPE_ENGINEERING_DEVICES = 'TYPE_ENGINEERING_DEVICES'
    TYPE_DATA_STORAGE = 'TYPE_DATA_STORAGE'

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018
0 голосов
/ 20 сентября 2018

Вам не нужно_

from sqlalchemy import not_
result = Device.query.filter(not_(DeviceGroup.type == ModelType.TYPE_BLADE_SERVER)).all()
or
result = Device.query.filter(~DeviceGroup.type == ModelType.TYPE_BLADE_SERVER)
...