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

2024-05-23 17:17:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试确定如何构造查询。我有两个来自外部数据库的模型,我正试图将它们导入到不同的模式中。源数据有三个模型:

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',
    )

在Memberships中,我有表示person和band的字段,包括create dates和update dates,以及其他相关数据。你知道吗

问题是:成员资格行没有任何表示规范记录的字段,它们混合并匹配人员、日期和其他数据。你知道吗

我现在正在做的是获取给定乐队的所有成员资格,对乐队和个人的组合运行distinct,并使用这些结果再次查询每个特定组合的最新实例的成员资格。虽然这个工作,正如你可能想象的是,是难以形容的缓慢,我知道一定有更好的办法。你知道吗

所以我在寻找如何使用一些高级django查询表达式(Window?结束,F表达式?)在数据库中尽可能多地完成这项工作。你知道吗

以下是获取所需记录的代码:

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

从单个查询生成。你知道吗

谢谢!你知道吗


Tags: 数据namedatemodelsgroup成员currentclass