首页 > 解决方案 > 根据祖父母实例 id 查找重复项并根据时间戳字段过滤掉较旧的重复项

问题描述

我正在尝试根据祖父母实例 id 查找 Django 模型对象实例的重复项,并根据时间戳字段过滤掉较旧的重复项。

我想我可以用distinct(*specify_fields)函数来做到这一点,但我不使用 Postgresql 数据库(docs)。我设法通过以下代码实现了这一点:

queryset = MyModel.objects.filter(some_filtering…) \
    .only('parent_id__grandparent_id', 'timestamp' 'regular_fields'...) \
    .values('parent_id__grandparent_id', 'timestamp' 'regular_fields'...)

# compare_all_combinations_and_remove_duplicates_with_older_timestamps
list_of_dicts = list(queryset)
for a, b in itertools.combinations(list_of_dicts, 2):
    if a['parent_id__grandparent_id']: == b['parent_id__grandparent_id']:
        if a['timestamp'] > b['timestamp']:
            list_of_dicts.remove(b)
        else:
            list_of_dicts.remove(a)

但是,这感觉很hacky,我想这不是最佳解决方案。有没有更好的方法(更好的意思是更优化,即最小化查询集的评估次数等)?我可以对查询集的方法做同样的事情吗?

我的模型看起来像这样:

class MyModel(models.Model):
    parent_id = models.ForeignKey('Parent'…
    timestamp = …
    regular_fields = …

class Parent(models.Model):
    grandparent_id = models.ForeignKey('Grandparent'…

class Grandparent(models.Model):
    …

标签: pythondjangoduplicatesdjango-queryset

解决方案


推荐阅读