Как я могу определить повторно используемые методы класса для общих предложенийwhere в моделях SQLModel, сохраняя функциPython

Программы на Python
Ответить
Anonymous
 Как я могу определить повторно используемые методы класса для общих предложенийwhere в моделях SQLModel, сохраняя функци

Сообщение Anonymous »

У меня есть проект, использующий библиотеку SQLModel, в котором модели определяют методы класса, возвращающие часто используемые предложенияwhere.
Например:

Код: Выделить всё

class Person(SQLModel, table=True):
age: int

@classmethod
def where_of_age(cls):
return cls.age >= 18
Может использоваться как:

Код: Выделить всё

with session:
query = Person.select().where(Person.where_of_age())
result = session.exec(query)
Это полезно, чтобы избежать повторения частых предложенийwhere в запросах к определенной таблице, но еще более полезно, когда предложениеwhere актуально для многих таблиц и может быть извлечено в родительском классе. . Например:

Код: Выделить всё

class SoftDeletable(SQLModel):
deletedAt: DateTimeType | None = None

@classmethod
def deleted(cls):
return cls.deletedAt.is_not(None)

class Person(SQLModel, SoftDeletable, table=True):
...
Однако это не работает в сочетании с функцией aliased(), которая иногда необходима при выполнении подзапросов:

Код: Выделить всё

aliasedPerson = aliased(Person, some_sub_query)
query = Person.select_from(Person).join(some_sub_query).where(aliasedPerson.deleted())
Здесь псевдоним должен указывать на использование Person в результатах some_sub_query, но на самом деле указывает непосредственно на таблицу Person .
Причина, по-видимому, в том, что aliasedPerson не является подклассом Person, а скорее прокси-объектом, который ретранслирует вызовы метода
к Person класс (который ничего не знает о псевдонимы)
Конечно, я мог бы решить эту проблему, сделав метод delete() функцией, которая вместо этого получает прокси-объект в качестве параметра:

Код: Выделить всё

class SoftDeletable(SQLModel):
deletedAt: DateTimeType | None = None

def deleted(target):
return target.deletedAt.is_not(None)

aliasedPerson = aliased(Person, some_sub_query)
query = Person.select_from(Person).join(some_sub_query).where(deleted(aliasedPerson))
но это кажется далеко не идеальным:
  • при составлении нескольких предложенийwhere таким образом параметр должен передаваться, несмотря на быть неявным
  • расширение/переопределение становится затруднительным
Есть ли какой-нибудь простой способ сохранить преимущества определения их как методы, поддерживая использование aliased()?

Подробнее здесь: https://stackoverflow.com/questions/792 ... lmodel-mod
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»