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