Найти дубликаты на основе идентификатора экземпляра дедушки и отфильтровать старые дубликаты на основе поля метки времени - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь найти дубликаты экземпляра объекта модели 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)

Тем не менее, это кажется хакерским, и я думаю, что это не оптимальное решение. Есть ли лучший способ (лучше я имею в виду более оптимальный, то есть минимизация количества раз, когда наборы запросов оцениваются и т. Д.)? Могу ли я сделать то же самое с методами queryset?

Мои модели выглядят примерно так:

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):
    …
...