Перезаписать Django модель __init__ метод - PullRequest
0 голосов
/ 02 марта 2020

Модель Ingredient моего проекта Django имеет IntegerField, который объявляет, управляется ли этот запас ингредиентов весом, единицами измерения или пометами.

Хотя база данных имеет значение integer, которое у меня есть отобразить его имя. И вместо того, чтобы перебирать каждый ингредиент и устанавливать его значение, я подумал, что было бы лучше перезаписать метод __init__ класса Python, но я не понимаю, как.

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

Какой аргумент я должен предоставить?

Ответы [ 2 ]

1 голос
/ 02 марта 2020

Если вы определите 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())
0 голосов
/ 02 марта 2020
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 
...