Ошибка типа с методом модели

#python #django #django-models

#python #django #django-модели

Вопрос:

Я пытаюсь добавить метод быстрого доступа, чтобы упростить вывод моих данных. Я написал следующий код (ненужные биты удалены):

 address_line_one = models.CharField(max_length=100)
address_line_two = models.CharField(max_length=100, blank=True)
address_city = models.CharField(max_length=50)
address_state = models.CharField(max_length=50)
address_zip = models.IntegerField()

def address(self):
    return self.address_line_one " " self.address_line_two " " self.address_city " " self.address_state " " self.address_zip
  

Это скорее… просто. Когда я запускаю его, я получаю следующую ошибку:

 Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/srv/www/energy/energy/customers/models.py", line 83, in address
    return self.address_line_two " " self.address_city " " self.address_state " " self.address_zip
TypeError: coercing to Unicode: need string or buffer, long found
  

Почему я получаю эту ошибку?

Комментарии:

1. Если address_zip является целым числом, не следует ли преобразовать его в строку при объединении? str(self.address_zip)

2. Верно, но не источник моей проблемы (я пытался удалить zip раньше)

3. Из любопытства я решил попробовать «return ‘test'», и я все еще получаю эту ошибку. Я думаю, что мне не хватает некоторого синтаксиса, необходимого для методов или чего-то еще

4. Понял это — по-видимому, это была проблема с тем, как я использовал оболочку для тестирования

Ответ №1:

Python строго типизирован. Это означает, что вы не можете объединить int в строку без явного преобразования.

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

Во-первых, каждый раз, когда вы обнаруживаете, что объединяете переменные в строковые литералы, вы должны использовать форматирование строки:

 return "%s %s %s %s %s" % (self.address_line_one,
                           self.address_line_two,
                           self.address_city,
                           self.address_state
                           self.address_zip)
  

Вы также могли бы использовать метод string join , но для этого вам нужно явно преобразовать целое число zip:

 return " ".join([self.address_line_one,
                 self.address_line_two,
                 self.address_city
                 self.address_state
                 unicode(self.address_zip)])
  

Комментарии:

1. Спасибо за очень подробный и хорошо написанный ответ. К сожалению, кажется, что независимо от того, что у меня есть в строке возврата, я получаю ошибку. Есть ли какой-то синтаксис django, которого мне не хватает?

Ответ №2:

Попробуйте это:

 def address(self):
    return " ".join([self.address_line_one, self.address_line_two, self.address_city, self.address_state, str(self.address_zip)])