Python 通过多个外键属性进行Django筛选

Python 通过多个外键属性进行Django筛选,python,django,django-models,foreign-keys,matching,Python,Django,Django Models,Foreign Keys,Matching,因此,我有Django模型,看起来如下所示: class Test(models.Model): cool_prop = models.CharField() class Metadata(models.Model): key = models.CharField() value = models.CharField() test = models.ForeignKey(Test) 我希望能够根据测试是否包含基于此元数据的key:value对来过滤测试。

因此,我有Django模型,看起来如下所示:

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

class Metadata(models.Model):
     key = models.CharField()
     value = models.CharField()
     test = models.ForeignKey(Test)
我希望能够根据测试是否包含基于此元数据的key:value对来过滤测试。基本上,我希望能够做到:

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

但我不确定如何在Django中执行此操作。我已经研究了F和Q语句。似乎大多数Django操作都会允许任何测试包含具有所述键的元数据和具有所述值的元数据。但是我需要测试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()

基本上,它相当于说get me the queryset of
Test
,它有以下任意一个键值对

如果您只测试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()

基本上,它相当于说get me the queryset of
Test
,它有以下任意一个键值对

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

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

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

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