Django 按多个外键属性过滤

Phi*_*sey 1 python django foreign-keys django-models matching

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

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

class Metadata(models.Model):
     key = models.CharField()
     value = models.CharField()
     test = models.ForeignKey(Test)
Run Code Online (Sandbox Code Playgroud)

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

tests = Test.objects.all().filter(metadata__key=key and metadata__value=value)
Run Code Online (Sandbox Code Playgroud)

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

kar*_*ikr 5

如果您只测试一组,则很简单:

tests = Test.objects.filter(metadata__key=key, metadata__value=value)
Run Code Online (Sandbox Code Playgroud)

如果你想匹配一堆键值对,

#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()
Run Code Online (Sandbox Code Playgroud)

基本上,这相当于说获取Test具有以下任意键值对的查询集。