Django按多个外键属性过滤

1 投票
2 回答
5028 浏览
提问于 2025-04-18 14:28

我有一些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查询结果。

撰写回答