Как проверить, есть ли в наборе запросов django соответствующий внешний ключ manytomany +?

Я пытаюсь проверить в Django, есть ли в пользовательском наборе запросов два поля из трех, которые совпадают 100%.

class Foo(models.Model):
    # ...
    free_field = models.ForeignKey(FreeModel, ...)
    must_match_m2m_field = models.ManyToManyField(ManyModel, ...)
    must_match_fk_field = models.ForeignKey(BarModel, ...)
    # ...

Итак, пользователь генерирует набор запросов модели "Foo" (с несколькими объектами в нем), который может содержать множество объектов с а) разными FreeModels и б) точно соответствующими ManyModels и BarModels. В серверной части мне нужно проверить, совпадают ли все многие модели и столбчатые модели в запросе.

для объектов внешнего ключа я сделал следующее (я думаю, это достаточно справедливо):

def check_same_objects(object_list):
        return len(set(object_list)) == 1

check_bars = check_same_objects(qs_foo.values_list('must_match_fk_field', flat=True))

Я сделал это для сравнения списков объектов в полях manytomany каждого объекта:

def check_same_lists(object_lists):
        for lst in object_lists:
            if set(lst) != set(object_lists[0]):
                return False
        return True


should_match_foos = []
for e in qs_foo:
        should_match_foos.append(e.must_match_m2m_field.all().values_list('id', flat=True))
check_manies = check_same_lists(should_match_foos)

# finally checking both 'must-match-fields':
check_both = all([check_bars, check_manies])

Каков более элегантный вариант проверки на python / django, совпадают ли эти два поля на 100% во всем qs?

Я нашел более короткое решение, которое мне нравится больше, чем оригинальное:

from collections import Counter

check_manies = check_same_objects(
                 Counter(qs_foo.values_list('must_match_m2m_field', flat=True).values()
                 )

итак, первого метода достаточно для всех полевых сравнений (хотя эффективность использования времени до сих пор неясна)...

Вернуться на верх