Использование пользовательского менеджера и набора запросов не работает должным образом со связанными объектами.

Даны две простые модели:

class Employee(Model):
    user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True)

class AttendanceLog(Model):
    from_datetime = models.DateTimeField(_('from'))
    to_datetime = models.DateTimeField(_('to'))
    employee = models.ForeignKey(Employee, on_delete=models.CASCADE, verbose_name=_('employee'))

Мы можем запросто получить журнал посещаемости some_employee: some_employee.attendancelog_set. Мы также можем использовать пользовательский набор запросов в журнале посещаемости (objects = AttendanceLogQuerySet.as_manager()), например:

class AttendanceLogQuerySet(models.QuerySet):
    def today(self):
        # returns logs that has to_datetime with today's date.
        return self.filter(
            to_datetime__date=date.today()
        )

Итак, мы можем получить посещаемость сотрудника за сегодня, выполнив:some_employee.attendancelog_set.today()

Проблема заключается в том, что мы пытаемся использовать как пользовательский менеджер, так и пользовательский набор запросов (objects = AttendanceLogManager()), например:

class AttendanceLogQuerySet(models.QuerySet):
    def today(self):
        # returns logs that has to_datetime with today's date.
        return self.filter(
            to_datetime__date=datetime.today()
        )

class AttendanceLogManager(models.Manager):
    def get_queryset(self):
        return AttendanceLogQuerySet(self.model, using=self._db)

    def some_special_create_method(self, some_args):
        pass

Получаем ошибку: AttributeError: 'RelatedManager' object has no attribute 'today'

Это должно работать в соответствии с документация о том, как использовать как QuerySet, так и Manager.


person emihir0    schedule 05.01.2018    source источник
comment
Я думаю, вы ищете этот stackoverflow.com/a/48124863/3627387   -  person Sardorbek Imomaliev    schedule 06.01.2018
comment
Даже при добавлении use_for_related_fields = True возникает ошибка. (Я использую версию 1.1.9, поэтому она еще не устарела)   -  person emihir0    schedule 08.01.2018


Ответы (1)


В вашем классе AttendanceLogManager вы должны определить:

def today(self):
    return self.get_queryset().today()

После этого в вашем классе AttendanceLog(Model) вам нужно объявить:

objects = AttendanceLogManager()

Я нашел эту ссылку очень полезно

person Solal    schedule 08.02.2019