【问题标题】:Using custom Manager & QuerySet does not work with related objects properly使用自定义 Manager 和 QuerySet 无法正确处理相关对象
【发布时间】:2018-06-15 18:40:36
【问题描述】:

给定两个简单的模型:

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

问题是当我们尝试同时使用自定义Manager和自定义Queryset(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'

这应该根据documentation 关于如何使用 QuerySet 和 Manager 来工作。

【问题讨论】:

  • 我想你正在寻找这个stackoverflow.com/a/48124863/3627387
  • 即使添加use_for_related_fields = True,也会引发错误。 (我用的是1.1.9版本所以还没有贬值)

标签: django django-models django-queryset django-managers


【解决方案1】:

在你的 AttendanceLogManager 类中,你应该定义:

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

在您的班级 AttendanceLog(Model) 之后,您需要声明:

objects = AttendanceLogManager()

我发现this link 很有帮助

【讨论】:

    猜你喜欢
    • 2013-04-24
    • 2021-02-03
    • 2010-12-14
    • 2016-03-23
    • 2011-01-10
    • 2015-11-04
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多