У меня есть следующая простая модель в Peewee:методы получения и установки в Peewee модели
class SiteText(BaseModel):
url = TextField()
text = TextField()
my_counter = IntegerField()
def get_text_by_url(url):
d = [s.text for s in SiteText.select(SiteText.url == url)]
d = d[0] if len(d) > 0 else None
return d
def save_text(updates):
# updates is a dict containing, url, text, my_counter
SiteText.upsert(**updates)
def get_outage_counter(url):
c = [c.my_counter for c in SiteText.select(SiteText.url == url)]
c = c[0] if len(c) > 0 else None
return c
def set_outage_counter(url, counter):
c = SiteText.get(SiteText.url == url)
c.counter = counter
c.save()
Тем не менее, чувствует себя довольно странные письма геттеры и сеттеры для некоторых атрибутов. Есть ли более питонический способ сделать это? Должен ли я, например, иметь один метод получения и установки счетчика сбоев для указанного URL? Должен ли я преобразовать функции getter и setter в свойства (хотя тогда они будут сталкиваться с фактическими атрибутами). Обратная связь приветствуем!
Будет ли это работать и в модели БД? Например, 'my_counter' должен быть определен как атрибут верхнего уровня и не нуждается в инициализации через' __init__'. Я так думаю, что он определен как класс «Поле». – mart1n
Существует способ использовать что-то вроде 'counter = property (getter_func, setter_func, del_func)', и он должен позволить вам использовать 'obj.counter', который будет вызывать getter_func или' obj.counter = 5', который вызывал бы функция setter func и т. д. – Nf4r
Спасибо, я решил использовать другой подход в конце, где я изменяю модель на месте, а не ее отдельные атрибуты. Тем не менее, ваше решение может работать так, чтобы принять правильный ответ. – mart1n