【问题标题】:Does rows exists in pivot table数据透视表中是否存在行
【发布时间】:2022-11-29 20:33:32
【问题描述】:

是否有更简洁的方法来检查数据透视表中是否存在项目的所有提供者? 例如。我的项目很少,如果其中一个项目有所有给定的提供者,那么方法应该返回 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

【问题讨论】:

  • 请将您的模型添加到问题中
  • @IainShelvington - 你真的不需要它,你可以看到有问题的架构。
  • @MaximDanilov 从问题中不清楚 ItemProviderConn 模型有什么约束,如果 itemprovider 在一起是唯一的,那么解决方案可能比如果不是的话更简单
  • 我认为这是通过模型 ItemProviderConn 从项目到提供者的简单 m2m。在问他们做了一个简单的过滤器,没有特别的地方。

标签: django


【解决方案1】:

当然你可以做得更好:

  1. 我希望你的itemsprovidersquerySets
  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 一起工作的我都可以排队。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-04
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多