Ошибка типа: объект 'abc' не может быть подписан - PullRequest
0 голосов
/ 03 июня 2019

Я пытаюсь отобразить диаграмму в моем приложении django, используя эту ссылку Интегрировать графики в Django

Вот мой Views.py

def json_example(request):
    return render(request, 'classroom/teachers/json_example.html')

def chart_data(request):
    dataset = DispatchPlan.objects.all()
    print("dataset is ", dataset)

    # port_display_name = dict()
    # for port_tuple in Passenger.PORT_CHOICES:
    #     port_display_name[port_tuple[0]] = port_tuple[1]

    chart = {
        'chart': {'type': 'pie'},
        'title': {'text': 'Titanic Survivors by Ticket Class'},
        'series': [{
            'name': 'Embarkation Port',
            'data': list(map(lambda row: {'name': row['weight'], 'y': row['route_distance']}, dataset))
        }]
    }

    return JsonResponse(chart)

Когда я запускаю приложение, оно показывает следующую ошибку:

TypeError: объект «DispatchPlan» не является подписным

в этой строке

'data': list(map(lambda row: {'name': row['weight'], 'y': row['route_distance']}, dataset))

Я предполагаю, что это потому, что я не отображаю это правильно, как мне решить это?

Traceback:

Traceback:

Файл "C: \ Users \ Sid \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ обработчики \ exception.py" во внутреннем 35. response = get_response (запрос)

Файл "C: \ Users \ Sid \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ обработчики \ base.py" в _get_response 128. response = self.process_exception_by_middleware (e, запрос)

Файл "C: \ Users \ Sid \ AppData \ Local \ Programs \ Python \ Python37 \ Lib \ сайт-пакеты \ Джанго \ ядро ​​\ обработчики \ base.py" в _get_response 126. response = wrapped_callback (запрос, * callback_args, ** callback_kwargs)

Файл "D: \ Downloads-HDD \ агрегатор-мастер \ django_school \ класс \ вид \ teachers.py" в chart_data 884. 'data': [{'name': row.weight, 'y': row.route_distance} для строки в наборе данных]

Файл "D: \ Downloads-HDD \ агрегатор-мастер \ django_school \ класс \ вид \ teachers.py" в 884. 'data': [{'name': row.weight, 'y': row.route_distance} для строки в наборе данных]

Тип исключения: AttributeError в / shipper / json-example / data / Значение исключения: объект 'dict' не имеет атрибута 'weight'

Models.py

class DispatchPlan(models.Model):
    bid_status_choices = (
        ('Hold', 'Hold'), ('Active', 'Active'), ('Assigned', 'Assigned'), ('Dispatched', 'Dispatched'),
        ('Delayed', 'Delayed'), ('Delivered', 'Delivered'))
    mtypes = (('Fragile', 'Fragile'), ('Non-Fragile', 'Non-Fragile'))

    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='dispatch_quizzes')
    comments = models.TextField(max_length=256)
    truck_type = models.ForeignKey(truck_type, on_delete=models.CASCADE, related_name='dispatch_type')
    truck_name = models.ForeignKey(truck_name, on_delete=models.CASCADE, related_name='dispatch_name')
    origin = models.CharField(max_length=255, default=0)
    destination = models.CharField(max_length=255, default=0)
    total_trucks = models.IntegerField(default=0)
    material_type = models.CharField(max_length=255, default=0, choices=mtypes)
    scheduled_date = models.DateTimeField(max_length=255, default=0)
    offered_price = models.IntegerField(default=0)
    weight = models.IntegerField(default=0)
    status = models.CharField(max_length=255, default='Active', choices=bid_status_choices)
    created_on = models.DateTimeField(auto_now_add=True)
    route_distance = models.IntegerField(default=0)
    route_tat = models.CharField(max_length=255, default=0)
    etd = models.DateTimeField(default=timezone.now)
    eta = models.DateTimeField(default=timezone.now)
    route_link = models.CharField(max_length=255, default=0)

1 Ответ

0 голосов
/ 03 июня 2019

Экземпляры моделей не являются словарями, это объекты с атрибутами.Вам необходимо использовать точечную нотацию:

'data': list(map(lambda row: {'name': row.weight, 'y': row.route_distance}, dataset))

Обратите внимание, этот код не является особенно Pythonic.Более логично использовать понимание списка:

'data': [{'name': row.weight, 'y': row.route_distance} for row in dataset]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...