Как получить столбцы/поля с запросом peewee?

Для модели

class User(db.Model, BaseUser):
    name = CharField()
    phone = CharField()
    age = IntegerField()
    points = IntegerField()

и список полей, lst = ['phone', 'name', 'points']

Есть ли способ заставить ваш запрос возвращать поля в lst?

Я не могу найти пример в документах, но он похоже, что ORM Джанго имеет что-то вроде ...get().values(lst).

Я попытался передать список в качестве аргумента User.select(), но получил

TypeError: issubclass() arg 1 must be a class

Я думаю, я мог бы сделать что-то вроде [getattr(obj, field) for field in lst] с результирующим объектом, но, кажется, должен быть лучший способ?

Обновление: ссылка на values в документации Django: здесь.


person beardc    schedule 04.06.2013    source источник


Ответы (6)


Вы можете использовать:

User.select(User.phone, User.name, User.points)

http://peewee.readthedocs.org/en/latest/peewee/api.html#SelectQuery

person coleifer    schedule 08.07.2013
comment
Спасибо, я использовал этот способ (на самом деле, что-то вроде User.select(*[getattr(User, f) for f in lst])), но мне было интересно, есть ли способ напрямую передать список строк с именами полей, например метод Django values. Я обновлю вопрос ссылкой на документы, на которые я ссылаюсь. - person beardc; 09.07.2013

Вы можете использовать:

lst = [User.phone, User.name, User.points]

User.select(*lst)

Я использую этот метод для динамического выбора полей SELECT из предопределенного списка.

person user3468635    schedule 27.03.2014

Не уверен, в чем ваша проблема, но вы пытались использовать object_list , с использованием flask-peewee ?

def user_query():

   lst_result = User.select().where(User.name == lst.name)

   return object_list('yourtemplate.html', lst_result, 'list_user')

Извините, если не сильно помогу.

С Уважением.

person hepidad    schedule 04.07.2013
comment
Спасибо, но похоже это для шаблонов Flask нет? (которым я не пользуюсь) - person beardc; 05.07.2013

Это старый, но я нашел ответ недавно.

Учитывая экземпляр u из таблицы User, u._data возвращает словарь с именем поля в качестве ключей.

Например:

db.connect() # db was established with connection parameters for your database
u = User.get() # get one record
print u._data # get dictionary with field names as keys
db.close() # free up your connection
person upandacross    schedule 24.08.2016

Решение этой проблемы — использовать tuples или dicts.

Например, для кортежей из документов:

stats = Stat.select(Stat.url, fn.Count(Stat.url)).group_by(Stat.url).tuples()

# iterate over a list of 2-tuples containing the url and count
for stat_url, stat_count in stats:
    print stat_url, stat_count

Например, для диктов из документов:

stats = Stat.select(Stat.url, fn.Count(Stat.url).alias('ct')).group_by(Stat.url).dicts()

# iterate over a list of 2-tuples containing the url and count
for stat in stats:
    print stat['url'], stat['ct']

Помните, что результаты являются итераторами, поэтому, если вы хотите, чтобы весь кортеж или словарь находился в памяти, вы должны инициализировать его методами по умолчанию: tuple(stats) или dict(stats).

Дополнительная информация здесь

person Willemoes    schedule 14.08.2017

Такие данные скрыты в метаданных Модели, вы можете получить к ним доступ следующим образом:

User._meta.fields.keys()

Это вернет объект dict_keys, если вы хотите, чтобы список просто проанализировал его -> list()

person SaulVP    schedule 03.02.2021