AttributeError 'NoneType' объект не имеет атрибута 'description' - PullRequest
0 голосов
/ 30 марта 2020

Я неделю бился с этой ошибкой и не могу найти решение. Я унаследовал устаревшее приложение, написанное на Django. Я знаком с Django, но не эксперт. Это приложение хорошо работает во многих различных средах, Heroku и некоторых других Linux дистрибутивах. Нам потребовалось установить пару новых экземпляров в Debian GNU / Linux 10. Большая часть приложения работает хорошо, но мы начали получать исключения для некоторых команд. Исключение понятно, я получаю вышеупомянутую ошибку в заголовке. Один из классов не может связать свойство, которое работает практически везде. На самом деле, я написал тестовую команду, которая имитирует загрузку большинства объектов, которые терпят неудачу в процессе, и я не вижу никакой ошибки.

После добавления большого количества отладочной информации, я мог бы прибить ее к паре из unicode методы:

class PrinterAutomaticRule(models.Model):
    printer = models.ForeignKey(Printer, on_delete=models.CASCADE, related_name='automatic_rules')
    description = models.TextField(u'Descripción', null=True, blank=True)
    # ... (mode irrelevant code)

    def __unicode__(self):
       return u'some text with weird chars ó {0}: {1}'.format(self.printer, self.description
            if self.description else u'another text with weird chars ó')

class Printer(models.Model):
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE, related_name='printers')
    name = models.CharField(u'Nombre', max_length=200)
    # ... (mode irrelevant code)


    def __unicode__(self):
        return u'{0} ({1})'.format(self.name, self.restaurant.name)


class Restaurant(models.Model)
    # you  can imagine the rest

Поскольку это не Engli sh, есть некоторые странные символы, и это требуется в том виде, в котором оно было создано для отображения на веб-сайте. Приложение немедленно работает, если мы заменим половину этих методов Unicode на то, что мы хотим. Вы можете видеть, что есть также еще один объект (self.printer), который выдает другой метод Unicode внутри.

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

Мне также не удалось создать больше отладочных выходных данных с Django, есть много try / catch, которые генерируют информацию о журналировании в базе данных и это не так просто go и заменить их все. Я закончил переписывать тонны кода, но это работающее приложение в других средах, поэтому я уверен, что что-то упустил.

Если я заменю этот конкретный код, то произойдет сбой другого Unicode, и я заменю следующий один есть еще один неудачный и так далее. Опять же, это хорошо работает во многих других местах.

Еще одна деталь, это приложение использует Postgres SQL. Я знаю, что Postgress очень хорошо работает с юникодом и даже конвертирует в случае несоответствия, а не сбоя.

РЕДАКТИРОВАТЬ

Добавление дополнительной информации. Есть одна конкретная линия, которая всегда терпит неудачу, несмотря ни на что.

    for printer in order.restaurant.active_printers.filter(type__description=PrinterType.fiscal_description):
        jobs = [print_job for print_job in [rule.get_print_job(order, now=now) for rule in printer.active_rules()]
                if print_job]
        if jobs:
            fiscal_print_job = jobs[0]

это немного запутанно, но всегда терпит неудачу. Причина в том, что в какой-то момент Django вызывает unicode в rule или active_rules (который заканчивается в коде, который я упоминал выше для PrinterAutomaticRules) или в принтере.

1 Ответ

0 голосов
/ 06 апреля 2020

Даже когда я все еще занимаюсь некоторыми исследованиями, это то, что я нашел. Я использую PyCharm для кодирования, поэтому кодирование в порядке. Как всем, наверное, известно, GIT хранит все как двоичный двоичный объект, поэтому в самом двоичном объекте нет преобразований. Когда я клонирую определенную ветвь c, не переходя назад и вперед, используя checkout, она работает отлично. Проблема возникает всегда, когда я клонирую весь репозиторий и переключаюсь назад и вперед в разные ветви. В этом случае вся кодировка испорчена, причина Django неудачи отличается, она не может справиться с кодировкой и не может связать мои свойства. Все работает хорошо в двух случаях:

  • Клонировать ветку, используя git clone --branch
  • Используя Windows

Я попробовал Ubuntu, Debian, и некоторые комбинации версий, все они терпят неудачу. Я не смог найти причину root.

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