Существуют ли строки в сводной таблице

Есть ли более чистый способ проверить, все ли провайдеры для элемента существуют в таблице pivot? Например. У меня есть несколько элементов, если у одного из них есть все заданные провайдеры, то метод должен возвращать True, иначе False

for item in items:
    exists_count = 0
    for provider in providers:
        if ItemProviderConn.objects.filter(
                item_id=item.pk,
                provider_id=provider.pk,
        ):
            exists_count += 1
        else:
            break

    if exists_count == len(providers):
        return True

return False

Конечно, вы можете сделать это лучше:

  1. Я надеюсь, что ваши items и providers являются querySets.
  2. если я правильно понимаю - вы хотите проверить, все ли провайдеры существуют в каком-либо элементе.

в данном случае:

provider_ids = providers.values_list('pk', flat=True)
length_of_providers = len(provider_ids)

#1. get a filter for providers
queryset = items.filter(ItemProviderConn__provider_pk__in=provider_ids)

#2. count a providers_id's
queryset =queryset.annotate(providercount=Count('ItemProviderConn__provider_pk'))

#3. check if a count of providers_id => length_of_providers
queryset=queryset.filter(providercount__gte=length_of_providers)

#4. return True if any item has enough providers
return queryset.exists()

Кстати - всю работу с пунктом queryset я могу сделать в строке.

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