#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)])