Django按多个外键属性过滤
我有一些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操作都会允许任何包含指定键和任何包含指定值的元数据的测试。但我需要的是那些在键和值上都匹配的元数据的测试。
2 个回答
1
你可以通过一个子查询来匹配元数据对象:
metadata = Metadata.objects.filter(key=key, value=value)
tests = Test.objects.filter(metadata__in=metadata).distinct()
5
如果你只测试一组数据,那就很简单:
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
查询结果。