如何将__str__方法应用于抽象超类的子类

时间:2019-07-09 12:10:29

标签: python django string django-models

我有3个模型,其中一个模型是Abstract超类,其中两个是该超类的子类。

我正在尝试在模型上实现简单的 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时,也会出现此错误。它还具有作为m2m关系的建筑物的ForeignKey。该模型如下所示:


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 个答案:

答案 0 :(得分:1)

我无法重现您的错误。
迁移运行正常,如下所示:

  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