Существуют ли строки в сводной таблице
Есть ли более чистый способ проверить, все ли провайдеры для элемента существуют в таблице 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
Конечно, вы можете сделать это лучше:
- Я надеюсь, что ваши
items
иproviders
являютсяquerySets
. - если я правильно понимаю - вы хотите проверить, все ли провайдеры существуют в каком-либо элементе.
в данном случае:
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
я могу сделать в строке.