Как добавить ограничение или предикат к уже определенной связи в SQLAlchemy в запросе? - PullRequest
4 голосов
/ 03 июня 2019

У меня есть отношение child_menus, определенное в модели Menu, поэтому, когда я запрашиваю Menu, я получу все его child_menus, а для каждого дочернего меню - его дочерние меню и так далее.Пока все работает нормально.

Теперь мне нужно добавить ограничение / предикат, чтобы при запросах в дочерние меню включались только меню с идентификатором, например, [11, 12].Конечно, идентификаторы будут динамическими и будут доступны мне во время запроса.

class Menu(BaseModel):

    __tablename__ = 'menu'

    name = db.Column(db.String(256), nullable=False, unique=True)
    parent_id = db.Column(db.BigInteger, db.ForeignKey(
    'menu.id', name='menu_parent_id_fkey', ondelete='CASCADE'))
    is_active = db.Column(db.Boolean, default=True)
        sequence = db.Column(db.Integer)

    def __repr__(self):
        return '<Menu row_id=%r, name=%r>' % (
            self.row_id, self.name)

    child_menus = db.relationship(
        'Menu', backref=db.backref(
            'parent_menu', remote_side='Menu.row_id', uselist=True
            ), passive_deletes=True)

class MenuSchema(ma.ModelSchema):

    class Meta:
        model = Menu

    # relationships
    child_menus = ma.List(ma.Nested(
        'menu.schemas.MenuSchema',
        dump_only=True))

menu_id = 1
child_menu_ids = [11, 12]
menu = Menu.query.get(menu_id)
# I need to add the additional constraint/predicate in the above query
result = MenuSchema().dump(menu)

Текущий результат:

{
    "row_id": 1,
    "name": "Webinar",
    "parent_id": null,
    "is_active": true,
    "sequence": 1,
    "child_menus": [
        {
            "row_id": 11,
            "parent_id": 1,
            "child_menus": [
                {
                    "row_id": 12,
                    "parent_id": 11,
                    "child_menus": [],
                    "name": "Webinar 1.1.1",
                    "is_active": true,
                },
                {
                    "row_id": 13,
                    "parent_id": 11,
                    "child_menus": [],
                    "name": "Webinar 1.1.2",
                    "is_active": true,
                }
            ],
            "name": "Webinar 1.1",
            "sequence": null,
        },
        {
            "row_id": 14,
            "parent_id": 1,
            "child_menus": [],
            "name": "Webinar 1.2",
            "is_active": false,
            "sequence": null
        }
    ],
}

Ожидаемый результат:

{
    "row_id": 1,
    "name": "Webinar",
    "parent_id": null,
    "is_active": true,
    "sequence": 1,
    "child_menus": [
        {
            "row_id": 11,
            "parent_id": 1,
            "child_menus": [
                {
                    "row_id": 12,
                    "parent_id": 11,
                    "child_menus": [],
                    "name": "Webinar 1.1.1",
                    "is_active": true,
                }
            ],
            "name": "Webinar 1.1",
            "sequence": null,
        }
    ],
}
...