【问题标题】:Django Filter by Multiple Foreign Key PropertiesDjango 按多个外键属性过滤
【发布时间】:2014-09-15 00:25:05
【问题描述】:

所以我有如下所示的 Django 模型:

class Test(models.Model):
    cool_prop = models.CharField()

class Metadata(models.Model):
     key = models.CharField()
     value = models.CharField()
     test = models.ForeignKey(Test)

并且我希望能够根据测试是否包含基于此元数据的键:值对来过滤测试。本质上,我希望能够做到:

tests = Test.objects.all().filter(metadata__key=key and metadata__value=value)

但我不确定如何在 Django 中执行此操作。我研究了 F 和 Q 语句。似乎大多数 Django 操作都允许任何具有所述键的任何元数据和具有所述值的任何元数据的任何测试。但我需要 1 个元数据在键和值中都匹配的测试。

【问题讨论】:

    标签: python django django-models foreign-keys matching


    【解决方案1】:

    如果你只测试1套,那就很简单了:

    tests = Test.objects.filter(metadata__key=key, metadata__value=value)
    

    如果要匹配一堆键值对,

    #Assuming that the keyvalue pairs is in a dictionary,
    import operator
    from django.db.models import Q
    
    k_v_pairs = (Q(metadata__key=key, metadata__value=value) for key, value in k_v_dictionary)
    tests = Test.objects.filter(reduce(operator.or_, k_v_pairs)).distinct()
    

    基本上,这相当于说让我得到Test 的查询集,它具有以下任何键值对。

    【讨论】:

      【解决方案2】:

      您可以为匹配元数据对象执行子查询:

      metadata = Metadata.objects.filter(key=key, value=value)
      tests = Test.objects.filter(metadata__in=metadata).distinct()
      

      【讨论】:

        猜你喜欢
        • 2010-12-31
        • 2017-02-04
        • 2021-09-04
        • 2022-09-26
        • 2011-05-19
        • 2013-09-04
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        相关资源
        最近更新 更多