Django按多个外键属性过滤

时间:2014-07-23 17:18:53

标签: 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)

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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的查询集,它具有以下任何键值对。

答案 1 :(得分:1)

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

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