Django __init__() принимает 1 позиционный аргумент, но было задано 6

Мой класс модели:

class Campaign(models.Model):
    name = models.CharField(max_length=255)
    campaign_id = models.CharField(max_length=8, null=False, blank=False, unique=True)

    def __init__(self):
        super(Campaign, self).__init__(self)
        self.campaign_id = generate_random_id(8) # it generates just random string

    class Meta:
        ordering = ["name"]

    def __str__(self):
        return self.name

Мой класс представления:

def campaign_list(request):
    campaigns = Campaign.objects.order_by('name').all()
    return render(request, 'mp/campaign/list.html', {'campaigns': campaigns})

Я получил ошибку

init() принимает 1 позиционный аргумент, но было задано 6

До создания init в моей модели все работало нормально. Но я предполагаю, что теперь Campaing.object.all() использует конструктор, а не str. Как я могу опустить это и в .all по-прежнему использовать только обращение к имени, не создавая объект заново?

Оверрайд метода сохранения вместо инициализатора:

class Campaign(models.Model):
    name = models.CharField(max_length=255)
    campaign_id = models.CharField(max_length=8, unique=True)

    def save(self, *args, **kwargs):
        self.campaign_id = generate_random_id(8)
        super().save(*args, **kwargs)

    class Meta:
        ordering = ["name"]

    def __str__(self):
        return self.name

Можно передать *args, **kwargs в качестве аргументов в init.

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)  # dont have to pass self
    self.campaign_id = generate_random_id(8) # it generates just random string

Вы также можете переопределить метод сохранения

def save(self, *args, **kwargs):
    self.campaign_id = generate_random_id(8)
    super().save(*args, **kwargs)
Вернуться на верх