Ошибка: «Объект« NoneType »не имеет атрибута ...» при использовании метода для независимого внешнего ключа - PullRequest
0 голосов
/ 26 июня 2018

Я разрабатываю свой первый проект Django для практики, и у меня возникла проблема с самореферентными внешними ключами.

У меня есть приложение под названием "единицы", в котором есть модели.py:

from django.db import models

class Unit(models.Model):
    name = models.CharField(
        'Unit', 
        max_length=255, 
        blank=True
        )
    quantity_per = models.DecimalField(
        'Quantity Per', 
        max_digits=10, 
        decimal_places=5, 
        default=1
        )
    subunit = models.ForeignKey(
        'self', 
        blank=True, 
        null=True, 
        on_delete=models.SET_NULL, 
        related_name='+', 
        verbose_name="subunit"
        )
    abbreviation = models.CharField(
        'Abbreviation', 
        max_length=255, 
        blank=True
        )

    def unit_factor(self):
        return self.subunit.quantity_per * self.quantity_per

    def __str__(self):
        return self.name

И это упоминается в моем простейшем шаблоне индекса следующим образом:

{% load static %}

<link rel="stylesheet" type="text/css" href="{% static 'units/style.css' %}"/>

{% if unit_list %}
  <ul>
    {% for unit in unit_list %}
    <li>{{ unit.name }} - {{ unit.subunit }} - {{ unit.subunit.quantity_per }} - {{ unit.unit_factor }}</li>
    {% endfor %}
  </ul>
{% else %}
  <p>No units are available.</p>
{% endif %}

Когда я запускаю сервер и перехожу к URL-адресу «единиц», я получаю следующую ошибку:

'NoneType' object has no attribute 'quantity_per'

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

ОБНОВЛЕНИЕ Я отмечаю это как решенное, но я хотел добавить свое представление согласно запросу @ alexandre-cox:

from django.template import loader
from django.views import generic

from .models import Unit

class IndexView(generic.ListView):
    template_name = 'units/index.html'

    def get_queryset(self):
        return Unit.objects.order_by('name')

Спасибо за ваше терпение, ответив на этот вопрос!

1 Ответ

0 голосов
/ 26 июня 2018

Исключение возникает из-за того, что у вашего экземпляра Unit нет дочернего элемента, и ваш код пытается получить доступ к атрибуту quantity_per дочернего элемента.

Итак, измените метод unit_factor(), как показано ниже,

def unit_factor(self):
    if hasattr(self, 'subunit') and hasattr(self.subunit, 'quantity_per'):
        return self.subunit.quantity_per * self.quantity_per
    return 0  # Default Value

См. Встроенную функцию python hasattr()

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