#django #django-models
#django #django-модели
Вопрос:
Я получаю эту ошибку на странице администратора только при обращении к объекту (как к внешнему ключу при добавлении записей в другую модель), но когда я создаю запись этой модели, она работает хорошо.
У меня есть этот кортеж вариантов для поля django
INSCRIPTION = 'INS'
CROSSFIT = 'CRF'
FUNCTIONAL = 'FUN'
KICKBOXING = 'KBX'
ALL_ACCESS = 'ALL'
UNSPECIFIED = 'UNS'
PAYMENT_CHOICES = (
(INSCRIPTION, 'Inscription'),
(CROSSFIT, 'Crossfit'),
(FUNCTIONAL, 'Functional'),
(KICKBOXING, 'Kickboxing'),
(ALL_ACCESS, 'All access'),
(UNSPECIFIED, 'Unspecified')
)
payment_code = models.CharField(max_length=3, choices=PAYMENT_CHOICES, default=UNSPECIFIED)
amount = models.FloatField()
def __str__(self):
choice_index = 0
if self.payment_code == self.CROSSFIT:
choice_index = 1
elif self.payment_code == self.FUNCTIONAL:
choice_index = 2
elif self.payment_code == self.KICKBOXING:
choice_index = 3
elif self.payment_code == self.ALL_ACCESS:
choice_index = 4
payment_name = str(self.PAYMENT_CHOICES[choice_index][1])
return payment_name
Я получаю ошибку, когда пытаюсь добавить запись в эту модель
class Payment(models.Model):
payment_type = models.ForeignKey(PaymentType, on_delete=models.SET("UNS"))
date = models.DateField(default=timezone.now)
reference = models.IntegerField()
athlete = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.payment_type
Комментарии:
1. пожалуйста, опубликуйте подробную информацию на странице ошибок
Ответ №1:
class Payment(models.Model):
payment_type = models.ForeignKey(PaymentType, on_delete=models.SET("UNS"))
date = models.DateField(default=timezone.now)
reference = models.IntegerField()
athlete = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.payment_type
изменить __str__
на
def __str__(self):
return self.payment_type.__str__()
__str__
метод принимает только строку в качестве возвращаемого значения, а не экземпляр FK.
Кстати, __str__
метод в другой модели :
def __str__(self):
choice_index = 0
if self.payment_code == self.CROSSFIT:
choice_index = 1
elif self.payment_code == self.FUNCTIONAL:
choice_index = 2
elif self.payment_code == self.KICKBOXING:
choice_index = 3
elif self.payment_code == self.ALL_ACCESS:
choice_index = 4
payment_name = str(self.PAYMENT_CHOICES[choice_index][1])
return payment_name
можно упростить до:
def __str__(self):
return self.get_payment_code_display()
смотрите get_FOO_display()
Комментарии:
1. Я добавил некоторый код для упрощения
__str__
метода в другой модели, посмотрите.2. Я знал, что должен быть более простой способ сделать это! Ха-ха, спасибо, это было очень полезно.