О u'foo'
:
Это нормальное поведение Python, u'something'
означает, что ваша строка является строкой Unicode. подробнее о строках Unicode см. Здесь
Вы можете исправить это, просто используя эту строку, чтобы записать dict
в виде строки JSON, кстати, вы должны всегда использовать [114 ] (или json.dumps()
) для записи строки JSON:
text_file.write(json.dump(data))
О порядке ключей :
Во-первых, RFC JSON прямо говорит об этом:
Объект - это неупорядоченная коллекция из нуля или более пар имя / значение, где имя - это строка, а значение - это строка, число, логическое значение, ноль, объект, или массив.
blockquote>Здесь « object » означает « hash », это то, что мы называем « dictionnaries » с помощью Python. Это означает, что ключи строки JSON никогда не упорядочены.
Кроме того,
data = json.load(json_file)
загружает строку JSON и анализирует ее в словарь Python. Диконы Python также не упорядочены (по крайней мере, до Python3.7).Это означает две вещи:
- Вы не можете прочитать файл JSON в ожидаемом порядке.
- Согласно пункту 1, не имеет смысла писать строку JSON в определенном порядке (поскольку вы не сможете прочитать ее в том же порядке)
См. Часто задаваемые вопросы по документации: « Как я могу увидеть необработанные SQL-запросы, выполняемые Django? »
django.db.connection.queries
содержит список запросов SQL:
from django.db import connection
print(connection.queries)
Наборы запросов также имеют атрибут query
, содержащий запрос, который должен быть выполнен:
print(MyModel.objects.filter(name="my name").query)
Обратите внимание, что вывод запроса не является допустимым SQL, потому что:
«Django никогда не интерполирует параметры: он отправляет запрос и параметры отдельно адаптеру базы данных, который выполняет соответствующие операции.»
Из отчета об ошибке Django # 17741 .
Из-за что вы не должны отправлять выходные данные запроса непосредственно в базу данных.
Я поместил эту функцию в util файл в одном из приложений в моем проекте:
import logging
import re
from django.db import connection
logger = logging.getLogger(__name__)
def sql_logger():
logger.debug('TOTAL QUERIES: ' + str(len(connection.queries)))
logger.debug('TOTAL TIME: ' + str(sum([float(q['time']) for q in connection.queries])))
logger.debug('INDIVIDUAL QUERIES:')
for i, query in enumerate(connection.queries):
sql = re.split(r'(SELECT|FROM|WHERE|GROUP BY|ORDER BY|INNER JOIN|LIMIT)', query['sql'])
if not sql[0]: sql = sql[1:]
sql = [(' ' if i % 2 else '') + x for i, x in enumerate(sql)]
logger.debug('\n### {} ({} seconds)\n\n{};\n'.format(i, query['time'], '\n'.join(sql)))
Затем при необходимости, я просто импортирую его и звоню, это от любого контекста (обычно представление) необходимо, например:
# ... other imports
from .utils import sql_logger
class IngredientListApiView(generics.ListAPIView):
# ... class variables and such
# Main function that gets called when view is accessed
def list(self, request, *args, **kwargs):
response = super(IngredientListApiView, self).list(request, *args, **kwargs)
# Call our function
sql_logger()
return response
хорошо сделать эту внешнюю сторону шаблон, потому что затем, если у Вас есть представления API (обычно Django Rest Framework), это применимо там также.
Взгляните на debug_toolbar , он очень полезен для отладки.
Документация и исходный код доступны на http: // django-debug-toolbar. readthedocs.io/[1128456 impression.[1225 impression
Хотя вы можете сделать это с помощью предоставленного кода, Я считаю, что использование приложения панели инструментов отладки - отличный инструмент для отображения запросов. Вы можете скачать его с github здесь .
Это дает вам возможность показать все запросы, выполненные на данной странице, а также время, затраченное на запрос. Он также суммирует количество запросов на странице и общее время для быстрого просмотра. Это отличный инструмент, если вы хотите посмотреть, что Django ORM делает за кулисами. В нем также есть много других хороших функций, которые вы можете использовать, если хотите.