【问题标题】:Django excluding a queryset without values() keywordDjango 排除没有 values() 关键字的查询集
【发布时间】:2015-09-22 14:54:45
【问题描述】:

我有几个模型,但我的问题是关于其中两个,A 和 B。

class A(models.Model):
    ...

class B(models.Model):
    a = models.ForeignKey(A)
    c = models.CharField(...)
    d = models.ForeignKey(C)

我只想排除这个查询集:

set1 = B.objects.all()

从下面的查询集:

set2 = A.objects.all()

我知道我可以通过以下方式解决这个问题:

set1 = B.objects.all().values('a')
set2 = A.objects.all().exclude(pk__in = set1)

但是对于剩余的代码,我需要 set1 的所有值。如果我使用 values(),我不能使用 set1 的“c”和“d”字段。

那么,有什么方法可以在不缩小B域的情况下排除?

PS:我更喜欢远离新的查询。我知道我可以编写第二个 B 对象查询来满足我的需要。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    是的,您可以使用列表推导:

    [obj.a for obj in queryset]
    

    这将为查询集中的所有对象返回一个带有a 属性的列表,而无需修改它们。

    【讨论】:

    • 我认为它会进行新的查询来为查询集收集 obj.a,我错了吗?
    • 一个查询集是惰性的,它会在你迭代它时被评估。如果a 是外键或相关字段,那么您将执行查询以获取每次迭代的相关对象。如果是这种情况,那么您应该根据具体情况使用select_related()fetch_related(),如果性能对您来说是个问题。见:docs.djangoproject.com/en/1.8/ref/models/querysets/…
    【解决方案2】:

    我相信您要的是没有相关 B 的模型 A 的实例。

    set2 = A.objects.filter(b__isnull=True)
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 2015-10-17
      • 2013-04-08
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 1970-01-01
      • 2020-02-14
      • 2015-08-31
      相关资源
      最近更新 更多