Django, TypeError: unhashable тип: 'dict', где ошибка? - PullRequest
0 голосов
/ 26 апреля 2020

Я новичок в django. Я пытаюсь запустить свой код, но выдает следующую ошибку: TypeError: unhashable type: 'dict'. Я проверяю весь код, но не понимаю, в чем ошибка. Более того, я не уверен в правильности моего кода. Не могли бы вы дать мне необходимую поддержку?

Здесь мои models.py

class MaterialeManager(models.Manager):

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).annotate(
            total=F('quantita')*F('prezzo'),
        )

    def get_monthly_totals(self):
        conto = dict((c.id, c) for c in Conto.objects.all())
        return list(
            (conto, datetime.date(year, month, 1), totale)
            for conto_id, year, month, totale in (
                    self.values_list('conto__nome', 'data__year', 'data__month')
                    .annotate(totale=Sum(F('quantita') * F('prezzo')))
                    .values_list('conto__nome', 'data__year', 'data__month', 'totale')
                    ))

class Conto(models.Model):
    nome=models.CharField('Nome Conto', max_length=30, blank=True, default="")
    def __str__(self):
        return  self.nome

class Materiale(models.Model):
    conto = models.ForeignKey(Conto, on_delete=models.CASCADE,)
    tipologia = models.ForeignKey(Tipologia, on_delete=models.CASCADE,)
    sottocategoria = models.ForeignKey(Sottocategoria, on_delete=models.CASCADE, null=True)
    um = models.CharField()
    quantita=models.DecimalField()
    prezzo=models.DecimalField()
    data=models.DateField('Data di acquisto', default="GG/MM/YYYY")
    objects=MaterialeManager()

    def __str__(self):
        return str(self.sottocategoria)

, а здесь мои views.py:

def conto_economico(request):
    defaults = list(0 for m in range(12))
    elements = dict()
    for conto, data, totale in Materiale.objects.get_monthly_totals():
        if conto not in elements:
            elements[conto.id] = list(defaults)
        index = data.month - 1  # jan is one, but on index 0
        elements[conto.id][index] = totale

    context= {'elements': elements,}

    return render(request, 'conto_economico/conto_economico.html', context)

1 Ответ

2 голосов
/ 26 апреля 2020

Вы пытаетесь использовать dict:conto в качестве ключа к своему словарю элементов. Это не сработает, потому что ключи словаря должны быть хешируемыми, а это не так. Вы можете использовать в качестве ключа другой представитель cont, такой как его имя или идентификатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...