@cart__man

Django Model фильтрация по свойству модели в queryset modelform.field как правильно делать?

Друзья, привет!
Имею в проекте django модель:
class AccountModel(models.Model):
    uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True)
    user_name = models.CharField( "Account name", null=True, blank=True, max_length=256)

    @property
    def task_inwork_count(self):
        return WorkModel.objects.filter(account=self.pk, status=1).count()


class WorkModel(models.Model):
    account = models.ForeignKey("AccountModel", on_delete=models.CASCADE)
    status = models.ForeignKey("StatusOfWork", default=1, on_delete=models.CASCADE)


Также есть форма, choicer поля account я пытаюсь заполнить моделями AccountModel, у которых свойство task_inwork_count == 0

class AddWorkForm(forms.ModelForm):
        def __init__(self, *args, **kwargs):
        super(AddWorkForm, self).__init__(*args, **kwargs)
        choices = (
            x
            for x in AccountModel.objects.filter(
                status=2, user_id=args[0]["user_id"]
            )
            if x.task_inwork_count == 0
        )
        print(choices)
        self.fields["account"].queryset = choices 

    class Meta:
        model = WorkModel
        fields = ["account"]


Но получаю вот такую ошибку при инициации формы:
File ".venv\Lib\site-packages\django\core\handlers\exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File ".venv\Lib\site-packages\django\core\handlers\base.py", line 197, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv\Lib\site-packages\django\contrib\auth\decorators.py", line 60, in _view_wrapper
    return view_func(request, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "core\views\view.py", line 38, in instagram_new_work
    form = AddWorkForm({"user_id": request.user.id})
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "core\forms\works.py", line 19, in __init__
    self.fields["account"].queryset = choices
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".venv\Lib\site-packages\django\forms\models.py", line 1516, in _set_queryset
    self._queryset = None if queryset is None else queryset.all()
                                                   ^^^^^^^^^^^^
AttributeError: 'generator' object has no attribute 'all'


Как правильно отфильтровать по @property внутри модели?

Заранее спасибо за ответы)
  • Вопрос задан
  • 31 просмотр
Пригласить эксперта
Ответы на вопрос 1
@Everything_is_bad
Мне надо ему дать AccountModel.objects.filter(status=2, user_id=args[0]["user_id"]), но что бы она еще фильтровалась по @property task_inwork_count
task_inwork_count нужно переносить на уровень SQL, читай про annotate и aggregate
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы