Как применить метод __str__ к подклассу абстрактного класса суперкласса - PullRequest
0 голосов
/ 09 июля 2019

У меня есть 3 модели, одна из которых является абстрактным суперклассом и две из которых являются подклассами, если этот суперкласс.

Я пытаюсь реализовать простой метод str на модели, но независимо от реализации он выдает мне эту ошибку:

TypeError: __str__ returned non-string (type NoneType)

Вот мои модели:


class DemandBase(models.Model):
    demand          = models.FloatField(blank=True, null=True)
    building        = models.ForeignKey(Building, on_delete=models.CASCADE)


    class Meta:
        abstract = True


class DemandHeat(DemandBase):

    def __str__(self):
        return str(self.id)


class DemandCool(DemandBase):

    def __str__(self):
        return str(self.id)

Хорошо, поэтому я попытался разыграть его, как в примере выше, но безуспешно попробовал также следующее:

return "This is an example {}".format(self.demand)

и это

return f"This is an example {self.demand}"

и это:

return "this is a string"

Все эти альтернативы работают на нормальных моделях, но здесь это не так, поэтому я предполагаю, что это связано с наследованием или абстракцией класса .....

Любая помощь или советы очень ценятся.Заранее спасибо!

РЕДАКТИРОВАТЬ: я также получаю эту ошибку, когда я пытаюсь создать новую BuildingGroup в администраторе.У этого также есть ForeignKey к зданиям как m2m отношение.Модель выглядит так:


class BuildingGroup(models.Model):
    description           = models.CharField(max_length=500, null=True, blank=True)
    project               = models.ForeignKey(Project, on_delete=models.CASCADE)
    buildings             = models.ManyToManyField(Building, default=None, blank=True)

    def __str__(self):
        return self.description


1 Ответ

1 голос
/ 09 июля 2019

Я не смог воспроизвести вашу ошибку.
Миграции прошли очень хорошо, как показано ниже:

  example/migrations/0001_initial.py
    - Create model DemandCool
    - Create model DemandHeat

Я использую Django == 2.2.3

Написал ту же модель,исключая ForeignKey (не должно иметь никакого значения)

example / models.py

  1 from django.db import models                                                                                       
  2                                                                                       
  3                                                                                                                    
  4 class DemandBase(models.Model):                                                                                    
  5     demand = models.FloatField(blank=True, null=True)                                                              
  6                                                                                                                    
  7     class Meta:                                                                                                    
  8     ┆   abstract = True                                                                                            
  9                                                                                                                    
 10                                                                                                                    
 11 class DemandHeat(DemandBase):                                                                                      
 12                                                                                                                    
 13     def __str__(self):                                                                                             
 14     ┆   return str(self.id)                                                                                        
 15                                                                                                                    
 16                                                                                                                    
 17 class DemandCool(DemandBase):                                                                                      
 18                                                                                                                    
 19     def __str__(self):                                                                                             
 20     ┆   return str(self.id)                                                                                        
 21         

python manage.py shell

Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from example.models import DemandHeat
>>> instance = DemandHeat(demand=0.7)
>>> instance.save()
>>> instance.__str__()
'1'
>>> print(instance)
1
...