很抱歉标题不清楚,我真的不知道该放哪些内容会完全描述我的问题,所以欢迎你编辑我的问题。
我正在构建我的第一个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实际上支持我想以某种方式完成的事情。
答案 0 :(得分:0)
我的问题是保存一些历史数据,但始终只检索每位员工当前的最新数据。
对不起,我只是在阅读这篇文章时感到困扰,并且正在试图你不知道latest
查询集。
https://docs.djangoproject.com/en/1.5/ref/models/querysets/#latest