【问题标题】:Django queryset traversal (without evaluation)Django 查询集遍历(无评估)
【发布时间】:2014-07-23 14:27:37
【问题描述】:

假设您有以下模型:

class Connect:
    a = models.ForeignKey(A)
    b = models.ForeignKey(B)

为了连接模型AB(此表对于数据目的是必需的,m2m 字段不够用)

假设我有一个特定的模型B 命名为b_model

a_models = Connect.objects.filter(b=b_model)

上面将是Connect 对象的查询集。我想要一个 A 对象的 QuerySet。以下将做到这一点:

a_models = [obj.a for obj in Connect.objects.filter(b=b_model)]

但这将评估 QuerySet 并创建一个列表。 我想创建一个尚未评估且属于 A 对象的 QuerySet。我怎样才能做到这一点?

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    如果你想要 A 对象,从 A 开始。

    a_objs = A.objects.filter(connect__b=b_model)
    

    【讨论】:

    • 谢谢,一年后我才回到 django,忘记了我能做到这一点。当我被允许时,我会接受
    【解决方案2】:

    AB 上,您可以使用以下代码为另一个模型(通过Connect)定义ManyToManyField

    class A(models.Model):
        ...
        b_models= models.ManyToManyField(B, through='Connect', through_fields=('a', 'b'), related_name='a_models')
    

    现在您可以使用两种方式遍历

    a_model.b_models  # queryset of Bs
    

    b_model.a_models  # queryset of As
    

    而且您不必直接查询Connect 模型。

    【讨论】:

      猜你喜欢
      • 2020-01-22
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2015-09-03
      • 1970-01-01
      相关资源
      最近更新 更多