繁体   English   中英

如何构造这个Django ORM queryset查询?

[英]how to construct this Django ORM queryset query?

我正在尝试确定如何构造查询。 我正在尝试从外部数据库中导入两个模型,这些模型要导入到不同的架构中。源数据具有三个模型:

class Group(model):
    ...
    name = models.CharField()

class Person(model):
    ...
    name = models.CharField()

class Membership(model):
    ...
    status = models.CharField()
    created_date = models.DateTimeField()
    modified_date = models.DateTimeField()
    person = models.ForeignKey(
        'Person',
        related_name='memberships',
    )
    group = models.ForeignKey(
        'Group',
        related_name='memberships',
    )

在“成员资格”中,我有代表个人和乐队的字段,其中包含创建日期和更新日期以及其他相关数据。

这就是问题所在:“成员资格”行没有任何字段代表标准记录,并且它们混合并匹配人员,日期和其他数据。

我目前正在做的是获取给定乐队的所有成员资格,对他们进行不同的乐队和人物组合,并使用这些结果再次查询成员资格以获取每个特定组合的最新实例。 尽管这可以奏效,但您可能想像的是如此缓慢,我知道必须有更好的方法。

因此,我正在寻找如何使用一些先进的django查询表达式(Window?Over,F-expressions?)来在数据库上尽可能地做到这一点。

这是使我获得所需记录的代码:

groups = (the groups I want)
for group in groups:
    unique_members = group.members.values(
        'person',
        'group',
    ).distinct()
    for member in members:
        current_member = group.members.filter(
            person__id=member['person'],
            group__id=member['structure'],
        ).lastest('created_date', 'modified_date')

使用current_member是该唯一个人/组组合的最新成员资格条目。

因此,对于这样的成员列表:

Person           Group        Created     Status
John Lennon      Beatles      1960-01-01  Current
Paul McCartney   Beatles      1960-01-01  Current
Pete Best        Beatles      1960-01-01  Expired
George Harrison  Beatles      1960-01-01  Current
Ringo Starr      Beatles      1962-01-01  Expired
Pete Best        Beatles      1964-01-01  Expired
Ringo Starr      Beatles      1966-01-01  Current

我想要以下列表:

John Lennon      Beatles      1960-01-01  Current
Paul McCartney   Beatles      1960-01-01  Current
Pete Best        Beatles      1964-01-01  Expired
George Harrison  Beatles      1960-01-01  Current
Ringo Starr      Beatles      1966-01-01  Current

从单个查询生成。

谢谢!

您可以先按所需条目对成员查询进行排序,然后获取Distict值。 这个问题可以帮助您:

Django查询:按列表获取所有不同值的最后一个条目

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM