覆盖 Django 模型 __init__ 方法

Posted

技术标签:

【中文标题】覆盖 Django 模型 __init__ 方法【英文标题】:Overwrite Django model __init__ method 【发布时间】:2020-06-14 08:07:47 【问题描述】:

我的 Django 项目的成分模型有一个 IntegerField,它声明此成分库存是否按重量、单位或窝来管理。

虽然数据库有它的integer 值,但我必须显示它的名称。与其循环遍历每种成分并设置其值,我认为最好覆盖 Python 类的 __init__ 方法,但我不明白如何。

models.py:

class Ingredient(models.Model):
    def __init__(self):
        super(Ingredient, self).__init__()
        if self.cost_by == 1:
            self.cost_by = 'Units'
        elif self.cost_by == 2:
            self.cost_by = 'Kilograms'
        elif self.cost_by == 3:
            self.cost_by = 'Litters'
#...etc...

到目前为止,我尝试了这个,但我收到以下错误:

__init__() takes 1 positional argument but 0 were given

我应该提供什么论据?

【问题讨论】:

你怎么称呼你的成分? Ingredient.objects.filter(account=account, brand=brand, name=name) 也许你可以试试 def __str__(self): if self.cost_by == 1: self.cost_by = 'Units' elif self.cost_by == 2: self.cost_by = 'Kilograms' elif self .cost_by == 3: self.cost_by = 'Litters' return self.cost 我认为@iamcoder 指的是创建时间。你是如何创造成分的?顺便说一句,声明为方法怎么样? 是的,可能有一种方法,然后在迭代获取成分时,您可以操作整数字段 【参考方案1】:

如果您在包含值到名称映射的字段上定义 choices,那么您将在任何 ModelForm 中为该字段呈现选择字段,您将获得在模型上生成的方法以获取显示名称对于选定的值get_<field_name>_display()

class Ingredient(models.Model):

    COST_BY_CHOICES = (
        (1, 'Units'),
        (2, 'Kilograms'),
        (3, 'Litters'),
    )

    cost_by = models.IntegerField(choices=COST_BY_CHOICES)

这样使用

ingredient = Ingredient(cost_by=1)
print(ingredient.get_cost_by_display())

【讨论】:

【参考方案2】:
class Ingredient(models.Model):
     cost_by = .....
     def __str__(self): 
         if self.cost_by == 1: 
             self.cost_by = 'Units' 
         elif self.cost_by == 2: 
             self.cost_by = 'Kilograms' 
         elif self.cost_by == 3: 
             self.cost_by = 'Litters' 
         return self.cost 

【讨论】:

【参考方案3】:

我在这里发现的问题是您没有将*args**kwargs 传递给模特的__init__() 和超级的__init__()

class Ingredient(models.Model):
    def __init__(self, *args, **kwargs):
        super(Ingredient, self).__init__(*args, **kwargs)
        # etc

【讨论】:

以上是关于覆盖 Django 模型 __init__ 方法的主要内容,如果未能解决你的问题,请参考以下文章

Django ModelForm 覆盖 __init__

django中对model模型添加方法

django中对model模型添加方法

关于django url 为啥会被覆盖?

Django HStore:如何覆盖键值模型字段的 __getattr__ 和 __setattr__

NotImplementedError:在 `__init__` 中有参数的层必须覆盖 `get_config`