通过字段自动从表中检索最新记录

时间:2014-02-24 00:58:50

标签: python django django-models

很抱歉标题不清楚,我真的不知道该放哪些内容会完全描述我的问题,所以欢迎你编辑我的问题。

我正在构建我的第一个Django webapp,它应该是一个管理员工工资单的应用程序(这对我的工作场所来说是内部的)。我这样做主要是为了学习Django,也是为了建立有用的东西。

我的问题是保存一些历史数据,但始终只检索每位员工当前的最新数据。我将提供一个例子,希望我能更容易解释。

假设我们有2个模型(我确实有类似的模型实现):

class Employee(models.Model):
    id = models.IntegerField(primary_key=True)
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    address = <not implemented yet>


class EmployeeAddress(models.Model):
    id = models.IntegerField(primary_key=True)
    employee = models.ForeignKey('Employee')
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=50)
    house = models.IntegerField()
    start_date = models.DateField()

我希望当我从address实例中检索字段Employee时,我只会获得该员工的最新地址。请注意,EmployeeAddress表保存每个员工的所有地址更改。在大多数情况下,我只需要最新的地址,我想直接从员工实例中检索它。现在,我可以通过将address字段设置为:

来解决此问题
 address = models.OneToOneField('EmployeeAddress')

并确保每次添加新地址时都将其更新为指向EmployeeAddress表中的最新记录。

但是以下示例中显示了一个更有趣的案例:

说我有另一个模特:

class EmployeePhone(models.Model):
    id = models.IntegerField(primary_key=True)
    employee = models.ForeignKey('Employee')
    number = models.IntegerField()
    start_date = models.DateField()
    end_date = models.DateField()

现在,在这种情况下,每个员工可能有几个(活动)电话记录(这些记录可能是家庭电话,工作电话,手机等......)。 在这种情况下,我想向Employee添加一个名为phone_number的新字段,并确保无论何时访问此字段,我都会得到一个仅包含该字段的活动电话记录的列表雇员。而不是从EmployeePhone向后明确查询Employee,然后在每次我想访问电话号码时通过缺少end_date的记录进行过滤,我希望能够轻松访问这些来自员工自身领域的记录。

如果电话号码表没有保存历史记录(意味着所有记录都处于活动状态,一旦记录不再有效,我们只需将其删除),这很简单,我可以通过迭代来获取所有电话记录Employee.employeephone_set - 这些都是该员工的有效电话号码。但由于我们有历史记录,这对我来说不再是有效选项,我需要在Employee.employeephone_set上添加其他查询(过滤器)以仅检索最新的有效电话号码。

还有更多的例子,例如银行账户历史表(类似于地址示例),以及每位员工的办公室职称(每个员工可能有几个)等等。

现在,有一种方法可以解决我的问题,那就是在Employee中实现一个属性,只要调用该属性的get方法,它就会自动查询和过滤手机表。但我想听听我(不那么难)问题的其他解决方案。

我可能在这个长篇文章中让这个问题看起来很重要,但事实上并非如此......我只是在想,也许我错过了一些东西......也许Django实际上支持我想以某种方式完成的事情。

1 个答案:

答案 0 :(得分:0)

  

我的问题是保存一些历史数据,但始终只检索每位员工当前的最新数据。

对不起,我只是在阅读这篇文章时感到困扰,并且正在试图你不知道latest查询集。

https://docs.djangoproject.com/en/1.5/ref/models/querysets/#latest