DJANGO-简单历史记录-如何使用标准Django ORM查找从基本模型中查找历史记录表

时间:2018-08-07 13:30:38

标签: django django-simple-history

这可能是一个简单的答案,但我在该主题上找不到肯定的“是”或“否”。我正在使用Django simple-history,并且尝试通过历史记录表中的信息过滤基本模型对象。因为simple-history是自动生成历史记录表的,并且我本身没有为其创建历史记录模型,所以我不知道django ORM查找语法是否在这里起作用。我的表关系看起来像this。这是模型:

class RepairForm(models.Model):
user_id = models.ForeignKey(User, on_delete=models.DO_NOTHING,)
return_number = models.CharField(max_length=200, unique=True)
incident = models.CharField(max_length=100, blank=True)
...
# Simple-history
history = HistoricalRecords()

我正在尝试根据它们的历史记录来过滤RepairForm对象。举个例子;在历史记录表中只有一个称为“ history_change_reason”的字段。这只是一个用于保存字符串的字段,(理想情况下)描述了更新发生的原因。引用我链接的表图像,我认为可以通过遍历它们与用户表之间的关系来使用RepairFormHistory表筛选出RepairForm对象。像这样:

RepairForm.objects.filter(user_id__repairformhistory__history_change_reason='Custom Repair form page')

“ repairformhistory”是我对历史模型(如果有的话)的最佳猜测。错误:

 Related Field got invalid lookup: repairformhistory

我要离开这里吗?我可以穿越这样的关系吗?即使没有用于“ repairformhistory”的模型,只是一个通过用户链接到原始表的表?

2 个答案:

答案 0 :(得分:1)

尝试

history = RepairForm.history.filter(history_change_reason='Custom Repair form page').first()

或包含一个user_id

history = RepairForm.history.filter(history_change_reason='Custom Repair form page', history_user_id=user_id).first()

然后使用此ID获取父对象

# check that there is a result
if history:
    # get related object
    Repairs = RepairForm.objects.filter(pk=history.pk)

答案 1 :(得分:1)

默认情况下,从历史模型到基本模型的外键存在,因为历史表包含基本模型中包含的所有字段。但是,由于密钥仅被复制为整数或uuid,因此数据库不知道这是外键。当前,我们在历史模型上具有instance属性,该属性返回历史实例的基本模型实例版本-但这仅适用于特定实例。我建议在这里执行的操作是在历史表中查询所需的ID,然后使用如下键过滤基本模型:

ids = list(HistoricalRepairForm.filter(incident='abc').order_by('id').distinct('id').values_list('id', flat=True))
RepairForm.filter(id__in=ids)
相关问题