我正在尝试确定如何构建查询。我有一个来自外部数据库的两个模型,我试图导入到另一个模式。源数据有三个模型:
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
从单个查询生成。
谢谢!
答案 0 :(得分:1)
您可以先按所需的条目订购成员查询,然后获取distict值。这个问题可以帮到你:
Django query: get the last entries of all distinct values by list