我有一个模型的实例。我有一个查询集。我可以检查实例是否匹配过滤器而不过滤所有模型对象?
情况:我有一个模型Alpha
,当创建这个模型时,我需要检查它是否匹配存储在模型Bravo
中的用户定义的过滤器。将有许多Alpha
模型和许多Bravo
模型(过滤器)。
class Alpha(models.Model):
test = models.CharField()
class Bravo(models.Model):
test = models.CharField()
def get_qs(self):
# These could be longish and complex, defined by users
return Q(test=self.test) | Q(test=f"{self.test}a")
# There will be many of these but I only want to check this instance
a = Alpha(test="testa")
# There will be many of these, I need to check if queries from get_qs match "a"
b = Bravo(test="test")
# Lots of Bravo, all need to be checked, unavoidable
for bravo in Bravo.objects.all():
# Lots of Alpha, don't want to check them all
# Just check "a" matches bravo.get_qs filter
if a in Alpha.objects.filter(bravo.get_qs()):
# Do something with "a" depending on which "b"
pass
我的假设是
if a in Alpha.objects.filter(bravo.get_qs())
将过滤所有Alpha
对象。我不想要这个,因为我不需要检查除“a”之外的任何其他实例,并且会有很多。我不想检查每个Alpha
对象的所有Bravo
对象。
我对其他如何做与上述类似的建议持开放态度。
您可以在a in Alpha.objects.filter(bravo.get_qs())
中检查具有与a
exists相同的主键的查询集,而不是Alpha
。
alpha = Alpha.objects.filter(pk=a.pk)
for bravo in Bravo.objects.all():
if alpha.filter(bravo.get_qs()).exists():
# Do something with "a" depending on which "b"