Почему я получаю эту ошибку «__str__ возвращено нестроковое» Django

#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. Я знал, что должен быть более простой способ сделать это! Ха-ха, спасибо, это было очень полезно.