如何在django模型管理器中覆盖last()

时间:2018-05-21 23:05:19

标签: django django-rest-framework

所以我在我的django应用程序中有一些重复的逻辑,我想重构进入模型层,特别是在last()方法中:

我基本上想要覆盖last以使其类似于filter,以便我可以运行查询:

Record.objects.last(build_id=1, name="test")

如果存在多个记录,则让它返回最后一条记录

所以它就像组合最后一个并过滤成一个。

class RecordManager(models.Manager):
    def last(self, *args, **kwargs):
    ''' returns last record, logs multiple instances if more than one 
        record exists '''
        try:
            record_queryset =  self.filter(*args, **kwargs)
            record_count = record_queryset.count()
            if record_count > 1:
                logger.debug("{} duplicates for record: {} found for this job. id's: {}".format(record_count, name, record_queryset))
            return record_queryset().order_by('-id')[0]

        except IndexError:
            return None

如果我运行Record.objects.filter(name =" jim") 我按预期收回了2条记录

如果我查询Record.objects.last(name =" jim") 我期待与filter()相同的结果,但是我得到了60条返回的记录,与之相同 Record.objects.all()

为什么last()没有过滤我的查询集?

我从来没有搞过Django的ModelManager,所以不确定我做错了什么。

1 个答案:

答案 0 :(得分:0)

尝试将方法定义更改为

def last(self, *args, **kwargs):
    ...