0

Given two simple models:

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'))

We can retrieve some_employee's attendance logs just fine: some_employee.attendancelog_set. We can also use custom queryset in attendance log (objects = AttendanceLogQuerySet.as_manager()), such as:

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()
        )

And so we can retrieve employee's attendance for today by doing:some_employee.attendancelog_set.today()

The problem is when we try to use both custom Manager and custom Queryset (objects = AttendanceLogManager()), such as:

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

We get an error: AttributeError: 'RelatedManager' object has no attribute 'today'

This should work according to documentation on how to use both QuerySet and a Manager.

emihir0
  • 1,200
  • 3
  • 16
  • 39

1 Answers1

0

In your class AttendanceLogManager, you should define :

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

After that in your class AttendanceLog(Model) you need to declare :

objects = AttendanceLogManager()

I found this link very helpful

Solal
  • 611
  • 2
  • 9
  • 26