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

DJANGO-简单历史-如何使用标准DJANGO ORM查找从基本模型查找历史表,django,django-simple-history,Django,Django Simple History,这可能是一个简单的答案,但我在这个问题上找不到确切的“是”或“否”。我正在使用Django,并试图通过历史记录表中的信息过滤基本模型对象。因为简单历史自动生成历史表,而且我没有为它本身创建历史模型,所以我不知道django ORM查找语法在这里是否有效。我的桌子看起来像。模型如下: class RepairForm(models.Model): user_id = models.ForeignKey(User, on_delete=models.DO_NOTHING,) return_numbe

这可能是一个简单的答案,但我在这个问题上找不到确切的“是”或“否”。我正在使用Django,并试图通过历史记录表中的信息过滤基本模型对象。因为简单历史自动生成历史表,而且我没有为它本身创建历史模型,所以我不知道django ORM查找语法在这里是否有效。我的桌子看起来像。模型如下:

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()
我正试图通过历史来过滤对象。例如,;历史记录表中只有一个名为“history\u change\u reason”的字段。它只是一个保存字符串的字段,该字符串(理想情况下)描述了更新发生的原因。参考我链接的表映像,我认为我可以通过遍历RepairFormHistory表中的RepairForm对象与用户表之间的关系来过滤它们。比如:

RepairForm.objects.filter(user_id__repairformhistory__history_change_reason='Custom Repair form page')
“repairformhistory”是我对历史模型(如果有)的最佳猜测。错误:

 Related Field got invalid lookup: repairformhistory
我是不是离基地太远了?我能穿越这样的关系吗?即使没有“repairformhistory”的模型,也只有一个通过用户链接到原始的表?

试试看

history = RepairForm.history.filter(history_change_reason='Custom Repair form page').first()
或包含用户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)
试一试

或包含用户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)

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

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

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

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

这不应该通过
过滤器(repairformhistory\uuu history\u change\u reason='some reason')
(带两个下划线)来实现吗?是的,你说得对。同样的问题,但错误现在更有意义。这不应该通过
过滤器(repairformhistory\uuuuuHistory\uChange\uReason='some reason')
(带两个下划线)?确认,是的,您的权利。同样的问题,但是错误现在变得更有意义了。尽管它返回历史记录对象。我需要RepairForm对象。您可以使用此对象获取父对象。也许有一种方法可以在单个查询中完成,但我不确定。这种方法可以工作,但可能不是返回历史记录对象的最有效方法。我需要RepairForm对象。您可以使用此对象获取父对象。也许有一种方法可以在单个查询中完成,但我不确定。这种方法可行,但可能不是最有效的