Django KeyError - Как справиться

У меня было приложение на Heroku, но затем я удалил свое приложение Heroku (бесплатная версия, поэтому она стала медленно бездействовать), чтобы улучшить скорость. Но теперь у меня одна ошибка за другой. Это «просто», так что это выполнимо, но мое решение как-то не работает, и я его не понимаю. У меня здесь одна строчка:

      val_b = our_total[city_data[1]][i] if our_total[city_data[1]][i] is not None else 0

что вызывает KeyError. Я не совсем понимаю, он выдает эти ошибки только в некоторых городах. Я нахожу это очень разочаровывающим, поскольку он работал до того, как я повторно развернул его в новом приложении. Кто-нибудь может заметить, что я делаю не так?

Я пытался сделать что-то вроде

      try:
    val_b = our_total[city_data[1]][i] if our_total[city_data[1]][i] is not None else 0
except KeyError:
    continue

Тогда он не будет отображать некоторые города, о которых я знаю, что в моей базе данных есть данные с городами.

Ссылки:

views.py

      class InventoryStatusView(LoginRequiredMixin, View):
    template_name = "lager-status.html"
    cinnamon_form = CinnamonForm(prefix="cinnamon_form")
    peber_form = PeberForm(prefix="peber_form")
    pc_model = InventoryStatus.objects.all()
    product_model = Product.objects.all()
    order_item_model = WCOrderItem.objects.all()
    shipment_model = WCOrderShipment.objects.all()
​
    def get_method_title(self, shipment):
        city_values = dict(InventoryStatus.CITIES).values()
        city_values = dict(InventoryStatus.CITIES).values()

        # Get the inventory the order is picked from based on shipment method title
        title = shipment.method_title.replace("Hent-selv", "").strip()

        if title not in city_values:
            title = "Hovedlager"
        return title

    def get(self, request):
​
        # Get total added to each city
        city_sum_added = self.pc_model.values('city').annotate(Sum('cinnamon'), Sum('peber'))
​
        print(f'city_sum_added: {city_sum_added}')
​
        # Get the amount of kilo attached to products
        queryset = ProductSpy.objects.select_related('product').values('product__product_id', 'kilo')
        product_data = {i['product__product_id']: i['kilo'] for i in queryset}
​
        shipments = self.shipment_model.prefetch_related(
            'order__itemOrder__product',
        )
        shipments = shipments.select_related('order')
​
        our_total = {}
        for shipment in shipments:
            method_title = self.get_method_title(shipment)
​
            for item in shipment.order.itemOrder.all():
                product = item.product
​
                # Check if we deal with kanel or peber as a product based on slug
                index = 0
                if product.slug.startswith("kanel-"):
                    index = 0
                elif product.slug.startswith("peber-"):
                    index = 1
​
                # do calculations
                k = product_data.get(product.id)
                if k:
                    kilos = item.quantity * k
                else:
                    continue
​
                if method_title not in our_total:
                    our_total[method_title] = [0, 0]
                our_total[method_title][index] += kilos
        # Start of the part with the error
        c = dict()
        for city_data in InventoryStatus.CITIES:
            values_to_find = ["cinnamon__sum", "peber__sum"]
​
            sums = dict()
            for i, value_to_find in enumerate(values_to_find):
                val_a = None
                val_b = None
​
                for elem_a in city_sum_added:
                    if elem_a["city"] == city_data[0]:
                        val_a = elem_a[value_to_find] if elem_a[value_to_find] is not None else 0
                        break
​
                val_b = our_total[city_data[1]][i] if our_total[city_data[1]][i] is not None else 0
                sums[value_to_find] = val_a - val_b
​
            c[city_data[1]] = sums
        print(c)
        # End the part with the error
​
        context = {
            "cinnamon_form": self.cinnamon_form,
            "peber_form": self.peber_form,
            "objects": objects,
            "deleted_objects": deleted_objects,
            "total_cinnamon": total_cinnamon,
            "total_peber": total_peber,
            "our_total": our_total,
            "c": c,
        }
        return render(request, self.template_name, context)

models.py

      class InventoryStatus(models.Model):
    CITIES = [
        ('9800', 'Hjørring'),
        ('9000', 'Ålborg'),
        ('7500', 'Holstebro'),
        ('8000', 'Århus'),
        ('6700', 'Esbjerg'),
        ('6230', 'Rødekro'),
        ('5220', 'Odense'),
        ('2300', 'København'),
        ('4682', 'Hovedlager'),
    ]

    cinnamon = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    peber = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)
    city = models.CharField(max_length=4, choices=CITIES)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    is_deleted = models.BooleanField(default=False)

    def __str__(self):
        return self.city

Трекбэк

      Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/inventory-status/

Django Version: 3.2.3
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'woocommerce',
 'crispy_forms',
 'el_pagination',
 'rest_framework',
 'django.contrib.postgres',
 'import_export',
 'accounts',
 'dashboard',
 'wpwoocommerce',
 'clients']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'whitenoise.middleware.WhiteNoiseMiddleware',
 '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 (most recent call last):
  File "/Users/x/PycharmProjects/lager/venv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/Users/x/PycharmProjects/lager/venv/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/Users/x/PycharmProjects/lager/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "/Users/x/PycharmProjects/lager/venv/lib/python3.8/site-packages/django/contrib/auth/mixins.py", line 71, in dispatch
    return super().dispatch(request, *args, **kwargs)
  File "/Users/x/PycharmProjects/lager/venv/lib/python3.8/site-packages/django/views/generic/base.py", line 98, in dispatch
    return handler(request, *args, **kwargs)
  File "/Users/x/PycharmProjects/lager/dashboard/views.py", line 264, in get
    val_b = our_total[city_data[1]][i] if our_total[city_data[1]][i] is not None else 0

Exception Type: KeyError at /inventory-status/
Exception Value: 'Ålborg'

0 ответов

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