【问题标题】:Django: Can I check if a model instance matches a filter without filtering all model instancesDjango:我可以在不过滤所有模型实例的情况下检查模型实例是否与过滤器匹配
【发布时间】:2019-09-13 00:56:43
【问题描述】:

我有一个模型实例。我有一个查询集。我可以在不过滤所有模型对象的情况下检查实例是否匹配过滤器吗?

情况: 我有一个模型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”之外的任何其他实例,而且会有很多。我不想检查每个 Bravo 对象的所有 Alpha 对象。

我愿意接受其他关于如何做与上述类似的事情的建议。

【问题讨论】:

    标签: python django django-models filter django-queryset


    【解决方案1】:

    您可以检查与a existsAlpha 中具有相同主键的查询集,而不是a in Alpha.objects.filter(bravo.get_qs())

    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" 
    

    【讨论】:

    • 如果我使用pk,我将不知道哪个Bravo 匹配。我可以做到Alpha.objects.filter(bravo.get_qs()).exists(),我不确定existsin 之间有什么区别,以及是否会有所改进。
    • 您可以链接过滤器。 exists 是对 in 的改进,因为它还通过主键进行过滤。理想情况下,第一个过滤操作返回的 QuerySet 应该匹配单个记录并返回一个 Alpha 实例
    猜你喜欢
    • 2020-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 2015-09-30
    • 2015-09-06
    • 2022-06-27
    • 2018-10-28
    相关资源
    最近更新 更多