Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中为我的所有模型编写_str__方法的通用实现?_Python_Django_Inheritance_Django Models_Abstract - Fatal编程技术网

Python 如何在Django中为我的所有模型编写_str__方法的通用实现?

Python 如何在Django中为我的所有模型编写_str__方法的通用实现?,python,django,inheritance,django-models,abstract,Python,Django,Inheritance,Django Models,Abstract,我希望我的所有模型都以类似的方式覆盖\uuuu str\uuu方法: class MyModel1(models.Model): name = models.CharField(max_length=255) def __init__(self): self.to_show = 'name' def _show(self): if hasattr(self,self.to_show): return str(ge

我希望我的所有模型都以类似的方式覆盖
\uuuu str\uuu
方法:

class MyModel1(models.Model):
    name = models.CharField(max_length=255)

    def __init__(self):
        self.to_show = 'name'

    def _show(self):
        if hasattr(self,self.to_show):
            return str(getattr(self, self.to_show))
        else:
            return str(getattr(self, 'id'))

    def __str__(self):
        return self._show()

class MyModel2AndSoOn(models.Model):
    another_param = models.CharField(max_length=255)
    # same implementation of `__str__` but with another_param
我不想对所有模型重复相同的代码,因此我尝试了继承:

class ShowModel(models.Model):
    name = models.CharField(max_length=255)

    def __init__(self):
        self.to_show = 'name'

    def _show(self):
        if hasattr(self,self.to_show):
            return str(getattr(self, self.to_show))
        else:
            return str(getattr(self, 'id'))

    def __str__(self):
        return self._show()

class MyModel1(ShowModel):
    another_param = models.CharField(max_length=255)

class MyModel2(ShowModel):
    another_param = models.CharField(max_length=255)
但是,它通过将
id
替换为指向
ShowModel
的指针,来干扰
MyModel1
MyModel2
id
。如何在没有继承的情况下为我的模型编写
\u_____
方法的通用实现,或者如何防止将
ShowModel
类视为Django模型

Upd:我使用了alecxe建议的
抽象
模型,但最后出现了一条错误消息:

in _show
    return str(getattr(self, self.to_show))
File "/path/to/my/project/env3/lib/python3.5/site-packages/django/db/models/fields/__init__.py", line 188, in __str__
model = self.model
AttributeError: 'CharField' object has no attribute 'model'
Upd如果我为模型对象的
name
字段赋值,一切正常。整体解决方案:

class ShowModel(object):
    to_show = 'name'

    def _show(self):
            if hasattr(self,self.to_show):
                return str(getattr(self, self.to_show))
            elif hasattr(self,'id'):
                return str(getattr(self, 'id'))
            else:
                return str(self)

    def __str__(self):
         return self._show()

    class Meta:
        abstract = True

class MyModel1(ShowModel):
    name = models.CharField(max_length=255)
    to_show = 'name'

class MyModel2(ShowModel):
    another_param = models.CharField(max_length=255)
    to_show = 'another_param'
在测试用例中:

ua = MyModel1()
ua.name = 'hi'
print(ua)
#prints hi

ub = MyModel2()
ub.another_param = 'hi again'
print(ub)
#prints hi again
您需要创建一个:


至于你的后续问题,多亏了@itzmeontv,你应该在调用
hasattr()
getattr()

时将
self.to\u show>替换为“to\u show”,这是一个出乎意料的简单答案!但它给出了以下错误:Upd问题。我的所有类都没有属性
show
。如果您将
添加到_show
中,则
hasattr(self,“添加到_show”)
检查
MyModel1
ShowModel
是否具有
toаu show
属性,但我要检查的是
MyModel
ShowModel
是否具有
toаu show
的值,即
name
属性@Саааааааааааа。谢谢。结果,当我尝试在管理中登记MyMoadE时,我得到一个错误:代码> Type错误:“Type”对象不是可迭代的< /COD>。@这样,更多的人可能会潜在地帮助和受益!谢谢你的理解!
class ShowModel(models.Model):
    name = models.CharField(max_length=255)

    def __init__(self):
        self.to_show = 'name'

    def _show(self):
        if hasattr(self, "to_show"):
            return str(getattr(self, "to_show"))
        else:
            return str(getattr(self, 'id'))

    def __str__(self):
        return self._show()

    class Meta:
        abstract = True