Разбор и циклический просмотр многоуровневых данных JSON в Django - PullRequest
1 голос
/ 03 мая 2020

У меня есть Django веб-сайт, и я звоню в Etsy's API для отображения продуктов на веб-сайте. Данные имеют несколько уровней (сокращенно ниже):

{
    "results":[
        {
            "title":"#020",
            "price":"5.99",
            "Images":[
                {
                    "url_570xN":"www.example.com/image1.jpg"
                }
            ]
        },
        {
            "title":"#051",
            "price":"5.99",
            "Images":[
                {
                    "url_570xN":"www.example.com/image2.jpg"

                }
            ]
        },
    ]
}

Я могу успешно извлечь данные из части results (title, price) и отобразить их в шаблоне, но я не могу ' не могу понять, как сделать то же самое для части Images (url_570xN). Я потратил несколько часов, пытаясь найти правильный синтаксис, но мне это не удалось.

Мой views.py:

# Note: The commented lines are the ones giving me problems.
# Removing them yields no errors and displays the info I want,
# minus the images

def products(request):
    parsed_data = []
    response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
    etsy_data = response.json()
    etsy_results = etsy_data['results']
    # etsy_images = etsy_data['results']['Images']

    for results in etsy_results:
        result_data = {}
        result_data['title'] = results['title']
        result_data['price'] = results['price']
        # for Images in etsy_images:
            # result_data['url_570xN'] = Images['url_570xN']
        parsed_data.append(result_data)

    return render(request, 'blog/products.html', {'data' : parsed_data})

Мой products.html шаблон:

{% for result in data %}
    <p>Title: {{result.title}}
    Price: {{result.price}}
    <img src={{result.url_570xN}} width="200px"></p>
{% endfor %}

И, наконец, сообщение об ошибке, которое я получаю, когда раскомментирую строки в моем views.py:

TypeError at /products/
list indices must be integers or slices, not str

Любая помощь будет принята с благодарностью. Спасибо!

РЕДАКТИРОВАТЬ 1: Вот полный ответ на то, что у меня есть выше:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/products/

Django Version: 2.2.4
Python Version: 3.7.4
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'blog.apps.BlogConfig',
 'crispy_forms',
 'django_summernote']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/myvenv/lib/python3.7/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/Users/MeganMcCarty/Documents/coding-projects/djangogirls/blog/views.py" in products
  21.     etsy_images = etsy_data['results']['Images']

Exception Type: TypeError at /products/
Exception Value: list indices must be integers or slices, not str

РЕДАКТИРОВАТЬ 2: Я изменил свой views.py следующим образом, основываясь на ответе Тома Каррика. Все работает сейчас, большое спасибо!

    parsed_data = []
    response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
    etsy_data = response.json()
    etsy_results = etsy_data['results']

    for results in etsy_results:
        result_data = {}
        result_data['title'] = results['title']
        result_data['price'] = results['price']
        result_data['url_570xN'] = results['Images'][0]['url_570xN']
        parsed_data.append(result_data)

    return render(request, 'blog/products.html', {'data' : parsed_data})

1 Ответ

2 голосов
/ 03 мая 2020

Проблема в том, что изображения не находятся под results, но они являются частью каждого элемента, на том же уровне, что и title и price. Также может быть несколько изображений, поэтому я предполагаю, что вы просто хотите первое для каждого продукта.

Итак, вместо этого вы хотите что-то вроде:

def products(request):
    parsed_data = []
    response = requests.get('https://openapi.etsy.com/v2/shops/{SHOP_ID}/listings/active?includes=Images:1:0&api_key={KEY}')
    etsy_data = response.json()
    etsy_results = etsy_data['results']

    for results in etsy_results:
        result_data = {}
        result_data['title'] = results['title']
        result_data['price'] = results['price']
        result_data['url_570xN'] = results['Images'][0]['url_570xN']
        parsed_data.append(result_data)

    return render(request, 'blog/products.html', {'data' : parsed_data})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...