Используйте метод модели в классе и переопределите этот метод

У меня есть метод complete в моей модели, как я могу использовать его в представлении моего класса, в методе моей модели есть один параметр под названием person, который передается, я не хочу, чтобы мой переопределенный метод использовал этот параметр. чтобы переопределенный метод использовал этот параметр, как я могу этого добиться.

class Mymodel(models.Model):

     is_done = model.BooleanField()
    
     def complete(self, person):
         self.is_done = True
         self.save(update_fields=['is_done'])
         self.done_by.add(person)


class MyView(SomeView):
    def complete_record(self):
        return Mymodel.complete(here it expects two arguments i need only self)

и я хочу избавиться от self.done_by.add(person) в полной модели метод

Метод complete() может быть вызван для одного экземпляра модели (одного объекта кверисета).

В представлении, возможно, вы хотите сделать это, если у вас есть параметр id в url:

instance = Mymodel.objects.get(pk=self.kwargs['id'])
instance.complete()

или сценарий может быть таким, если вы используете DetailView:

self.get_object().complete()

-- РЕДАКТИРОВАТЬ --
. Если вы хотите установить is_done = True без добавления человека и если вы не можете редактировать класс модели, вы можете поместить логику в представление:

class MyView(SomeView):
    def complete_record(self):
        record = Mymodel.objects.get(pk=id)
        record.is_done = True
        record.save()
        return record

Вы можете добавить второй метод к вашей Модели, который не использует аргумент person.

models.py

class Mymodel(models.Model):
    is_done = model.BooleanField()

    def complete(self, person):
        self.is_done = True
        self.save(update_fields=['is_done'])
        self.done_by.add(person)
    
    def complete_without_person(self):
        self.is_done = True
        self.save(update_fields=['is_done'])

Метод должен быть вызван для конкретного экземпляра вашей модели в вашем представлении.

class MyView(SomeView, model_id):
    def complete_record(self):
        return Mymodel.objects.get(pk=model_id).complete_without_person()
Вернуться на верх