Использование обратного отношения ForeignKey для получения количества детей для текущего объекта, не работающего должным образом - PullRequest
1 голос
/ 09 января 2020

В настоящее время я делаю приложение Todo, у меня есть несколько Todolist, каждый из которых может содержать несколько задач, вот как я сделал свои модели:

class Todo(models.Model):
    name = models.CharField(max_length=120)
    total_tasks = models.IntegerField(default=0)
    completed_tasks = models.IntegerField(default=0)

    def update_total_tasks(self):
        self.total_tasks = self.task_set.all()

    def _str_(self):
        return self.name


class Task(models.Model):
    name = models.CharField(max_length=120)
    completed = models.BooleanField(default=False)
    todo = models.ForeignKey(Todo, on_delete=models.CASCADE, related_name="tasks")

Моя задача содержит все текущие и завершенные задачи. функция update_total_tasks предназначена для запроса всех задач, связанных с этим конкретным делом, и соответствующего обновления поля.

Эта функция вызывается каждый раз, когда задача создается / обновляется с помощью:

@receiver(models.signals.post_save, sender=Task)
def execute_after_save(sender, instance, created, *args, **kwargs):
    instance.todo.update_total_tasks()

Приемник работает и правильно вызывает мою функцию обновления, хотя кажется, что запрос сделан неправильно, потому что я получаю эту ошибку:

AttributeError: 'Todo' object has no attribute 'task_set' 

У вас есть идеи, почему она не работает должным образом?

Спасибо.

1 Ответ

2 голосов
/ 09 января 2020

Параметр related_name=… [Django -doc] установлен на 'tasks'. Следовательно, вы получаете доступ к отношению в обратном порядке с помощью .tasks.

. Таким образом, вы получаете доступ к этому с помощью:

class Todo(models.Model):
    name = models.CharField(max_length=120)
    total_tasks = models.IntegerField(default=0)
    completed_tasks = models.IntegerField(default=0)

    def update_total_tasks(self):
        self.total_tasks = self.<b>tasks</b>.count()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...