【问题标题】:Howto merge 2 Django QuerySets in one and make a SELECT DISTINCT如何将 2 个 Django QuerySet 合并为一个并创建一个 SELECT DISTINCT
【发布时间】:2010-11-10 16:23:32
【问题描述】:
模型.py
class SinglePoint(models.Model):
    attributes = models.TextField(blank=True)
    name = models.CharField(max_length=100)
    geom = models.PointField() #Kartenposition
    objects = models.GeoManager()

class Connection(models.Model):
    name = models.CharField(max_length=100)
    #points = models.ManyToManyField(SinglePoint) #OLD
    p1 = models.ForeignKey(SinglePoint, related_name='p1_set') #NEW
    p2 = models.ForeignKey(SinglePoint, related_name='p2_set') #NEW
    obs = models.ManyToManyField(Observation, blank=True)
    conds = models.ManyToManyField(Condition, blank=True)
    objects = models.GeoManager()

class Meta:
    order_with_respect_to = 'p1'

在我看来.py:

...
p1_points = SinglePoint.objects.filter(p1_set__vektordata__order__project__slug=slug)
p2_points = SinglePoint.objects.filter(p2_set__vektordata__order__project__slug=slug)
...

在我切换到 ForeignKey 之前,它与:

points = SinglePoint.objects.filter(connection__vektordata__order__project__slug=slug)

如何将这两个 QuerySet 'join' 到一个 QuerySet 并创建一个 distinct()?

谢谢!

【问题讨论】:

    标签: django distinct geodjango django-queryset


    【解决方案1】:

    我花了一段时间才找到这个

    all_points = p1_points | p2_points
    

    【讨论】:

    • 这个'|'的名字是什么python中的运算符?
    • 在 python 中,| 运算符被称为“按位或”或“联合集”运算符,具体取决于其使用方式的上下文:
    • 也可以称为“或”运算符:)
    【解决方案2】:

    我不熟悉 geodjango,但是可以通过 Q-Object 和布尔运算符将 QuerySet 组合成一个 QuerySet。见http://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects

    例子:

    Q(p1_points) | Q(p2_points)
    

    我无法进一步帮助您,因为我不确定您要完成什么。

    【讨论】:

    • 我想在我的项目中获取所有 SinglePoint 实例,而不需要双 SinglePoint 实例(不同)。 ManyToMany-Field 没有问题,因为那时我使用 .filter(connection__vektordata__ ...).distinct() 访问它们,现在我有两个字段:.filter(p1_set__vektordata__ ... 和 .filter(p2_set__vektordata__ ... )
    • 抱歉,我的意思是“字段”而不是“字段”
    • 结果 = Q(p1_points) | Q(p2_points) results.children 给了我 [[, ], [, ]] 但我希望有 [, , , ] 调用 distinct()
    【解决方案3】:

    我认为Q queries可以像这样实现你所需要的:

    points = SinglePoint.objects.filter(
        Q(p1_set__vektordata__order__project__slug=slug) |
        Q(p2_set__vektordata__order__project__slug=slug)
    ).distinct()
    

    【讨论】:

      【解决方案4】:

      p1_points.union(p2_points)

      Docs

      【讨论】:

      • union() 的问题在于它将操作限制在结果查询集中。例如,你不能 .filter().annotate() 这是一个很大的缺点。阅读更多关于它的信息in the docs
      猜你喜欢
      • 2010-10-07
      • 2011-01-20
      • 2018-04-26
      • 1970-01-01
      • 1970-01-01
      • 2021-09-22
      • 2017-12-11
      • 1970-01-01
      • 2014-02-07
      相关资源
      最近更新 更多