Можно ли добавить пользовательские методы к встроенным «моделям» Web2Py? - PullRequest
2 голосов
/ 07 марта 2012

Правильно ли, что в Web2Py вы не способны создавать собственные методы внутри "моделей", чтобы они могли содержать бизнес-логику, которую вы хотите реализовать в моделях?

В случае с Django вы можете просто сделать что-то вроде:

class Aircraft(models.Model):
    '''I am an aircraft. I can fly, if I am created in Django.
    '''
    name = models.CharField(max_length=20)
    def fly(self):
        # ... some advanced logic here ...
        return 'I am flying'

Но возможно ли сделать что-то подобное (создать собственные методы) в Web2Py без необходимости писать всю систему ORM с самого начала или совместно использовать один метод между экземплярами всех таблиц? Есть ли какой-нибудь установленный способ сделать это? Например:

db.define_table("aircrafts",
    Field("name", type="string", length=20)
)

aircraft = db(db.aircrafts).select().first()

# I am an aircraft too, please make me fly
aircraft.fly()

1 Ответ

2 голосов
/ 07 марта 2012

Да, вы можете определить виртуальные поля :

db.aircrafts.fly = Field.Virtual(lambda row: 'I am flying')
aircraft = db(db.aircrafts).select().first() 
print aircraft.fly

или

db.aircrafts.fly = Field.Lazy(lambda row: 'I am flying')
aircraft = db(db.aircrafts).select().first() 
print aircraft.fly()

В первом примере выше значение "fly" вычисляется автоматическидля всех записей, когда они выбраны.Во втором примере вычисления ленивы и выполняются только тогда, когда .fly() фактически вызывается для конкретной записи.

Вы также можете сделать это с виртуальными полями старого стиля , которые могут бытьлучше для сложных функций.

Обратите внимание, что это обрабатывается иначе, чем в Django, потому что web2py использует слой абстракции базы данных (DAL), а не ORM.Таблицы моделируются не как пользовательские классы, а как экземпляры класса DAL Table.

...