Есть ли способ выбрать значение только из словаря из файла JSON?

У меня есть веб-сайт, который я размещаю с помощью flask и использую mongodb для хранения данных. я использую htmx для сброса данных, но столкнулся с проблемой; когда данные сбрасываются, он показывает весь словарь, когда мне нужно только значение из словаря. Кажется, это легко исправить, но поскольку я новичок в htmx, я понятия не имею, что делать.

вот моя текущая настройка колбы:

@app.route('/data')
def get_data():
    return json.loads(dumps(collection.find()))

и мой HTML:

<h1>MongoDB Data Test</h1>
<div id = "data-container" 
   hx-get = "/data" 
   hx-trigger = "load, every 3s" 
   hx-target = "#data-container" 
   hx-swap = "innerHTML">
   <!-- Data will be injected here -->
   <span></span>
</div>

вот что показано на сайте: [ { "_id": { "$oid": "id" }, "count_testing": 15 } ] мне нужно только значение count_testing (т. е. 15), а не весь словарь, который будет отображаться на веб-сайте.

что такое dumps?

juanpa.arrivillaga 15.08.2024 21:42

это из bson.json_util

user26831591 15.08.2024 23:19

Используете ли вы jinja2, pywebview или любой другой модуль или фреймворк?

Suramuthu R 15.08.2024 23:32

я использую flask, jinja2 и htmx для перезагрузки данных из mongodb

user26831591 15.08.2024 23:38
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

@app.route('/data')
def get_data():
    return str(json.loads(dumps(collection.find()))[0]["count_testing"])

«Ошибка типа: функция просмотра не вернула допустимый ответ. Тип возвращаемого значения должен быть строкой, словарем, списком, кортежем с заголовками или статусом, экземпляром ответа или вызываемым WSGI, но это было целое число».

user26831591 15.08.2024 23:25

Исправил, спасибо, код не проверял 😀

Cornelius Roemer 16.08.2024 00:38
Ответ принят как подходящий

Лучший способ сделать это - на стороне Python, IMO. Поместите данные в переменную, запустите для них анализ списка, верните результат. Нравиться:

def get_data():
    data = list(collection.find()) 
    filtered_data = [item['count_testing'] for item in data if 'count_testing' in item]
    return jsonify(filtered_data)

как убрать скобки списка? это не так уж и важно, поскольку дает очень чистый результат, но если можно удалить скобки списка, это решение было бы отличным. Я предполагаю, что удалить скобки можно только на стороне html.

user26831591 15.08.2024 23:22

Кроме того, как мне заставить это работать для нескольких элементов?

user26831591 16.08.2024 00:13

На данный момент это просто стандартное программирование на Python. Спросите в Чатгпте 🙈

Cornelius Roemer 16.08.2024 00:41

@user26831591 ','.join(filtered_data) превратит список в строку, разделенную запятыми.

Barmar 16.08.2024 00:42

@Barmar, я не могу использовать ', '.join(filtered_data) для своих данных, потому что .join не допускает целых чисел. однако это легко исправить, используя ', '.join(map(str, filtered_data)). функции карты преобразуют каждое значение в строку, что позволяет мне использовать .join. на веб-сайте вместо скобок отображаются цитаты, что вы также можете исправить, вернув ответ в виде обычного текста, т. е. return Response(data_string, mimetype='text/plain') однако у меня есть вопрос; что, если я захочу использовать совершенно разные значения? нужно ли мне хранить значения в совершенно разных каталогах?

user26831591 16.08.2024 00:55

чтобы уточнить, предположим, что у меня есть два значения в одной коллекции: count_testing и message_count. хотя я мог бы легко извлечь оба значения из базы данных mongodb, они всегда будут вместе. я хочу, чтобы это отображалось на сайте следующим образом: test count: (count_testing value) message count: (message_count value). нужно ли мне использовать два разных маршрута приложения?

user26831591 16.08.2024 01:24

ничего, решено! извлеките нужные вам данные в список с помощью понимания списка (или другого метода), а затем вы можете указать индексы в списке, а также добавить разрыв для разделения значений: data_string = f'count: {filtered_data[0]}<br>message_count: {filtered_data[1]}' обязательно верните их в виде обычного текста через Response

user26831591 16.08.2024 01:54
  1. collection.find() возвращает объект курсора, содержащий документы. Обратите внимание: каждый документ имеет поля и значения. например, если вы хотите получить все поля и значения первого объекта, вам нужно вызвать метод Collection.find()[0], который возвращает dict

    dct = collection.find()[0]
    print(dct)
    # Output:    {'a':1, 'b':2}
    
  2. Используя return json.loads(dumps(collection.find())), вы конвертируете строку dict в json и, в свою очередь, преобразуете ее в строку dict.

Я имею в виду получить конкретный документ и вернуть значения. Например,

@app.route('/data')
def get_data():
    cursor = collection.find()

    # access document with specific index or specific _id or query. I used index 0
    dct = cursor[0] 

    # values = [x for x in dct.values()]
    # Edited as you want specific value
    val = dct['count_testing']
    return val
[x for x in dct.values()] можно упростить до list(dct.values())
Barmar 16.08.2024 00:41

Как это возвращает только поля count_testing?

Barmar 16.08.2024 00:42

Смотрите мой отредактированный ответ @Barmar

Suramuthu R 16.08.2024 00:46

Другие вопросы по теме