代码之家  ›  专栏  ›  技术社区  ›  david

如何重写django模型管理器中的last()。

  •  2
  • david  · 技术社区  · 7 年前

    因此,我在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的模特经理搞过交道,所以不知道我做错了什么。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ralf    7 年前

    尝试将方法定义更改为

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