• JSON ломает типы данных, как избежать?

    aRegius
    @aRegius
    Python Enthusiast
    Как вариант, согласно документации, одним из именованных аргументов функции json.load является object_pairs_hook (описание по ссылке). Соответственно, можно воспользоваться собственной функцией как значением данного аргумента, типа:
    def int_keys_preserve(key_val_pairs):
    	  new_dict = {}
    	  for key, value in key_val_pairs:
    		    key = int(key)
    		    new_dict[key] = value
    	  return new_dict
    
    >>> test = {1: '1', 2: '2', 3: '3'}
    >>> js = json.dumps(test)
    >>> json.loads(js)
    {'1': '1', '2': '2', '3': '3'}
    >>> json.loads(js, object_pairs_hook=int_keys_preserve)
    {1: '1', 2: '2', 3: '3'}


    P.S. Функция написана для примера по-сути и все возможные доработки (типа проверки на isdigit и обработки исключений) реализуйте уже самостоятельно под свои нужды. Ну и она, очевидно, не обработает вариант, при котором "родной" ключ будет isdigit (сконвертирует в int).
    Ответ написан
    Комментировать
  • Как писать цикл внутри views.py в Django?

    @iMrDron
    Все это можно сделать при помощи аннотаций примерно так:
    artists = (
        Artist.objects
        .filter(album_set__genres__name__in=["Traditional music", "Juz"])
        .annotate(album_count=Count('album_set', distinct=True))
    )

    В цикле делать запросы к бд недопустимо вообще! Изучите аннотации, если бывает что их возможностей не хватает, допустим нужно делать ещё промежуточные вычисления, тогда нужно идти по другому пути доставать из базы всех артистов, доставать одним запросом все альбомы для артистов отфильтрованные по genres, и уже по результатам итерироватся и считать что нужно.
    Ответ написан
    Комментировать