'ReverseManyToOneDescriptor'对象没有属性'latest'

Era*_*Era 3 python django attributeerror

尝试运行函数时收到此错误.这是我的第一个django/python项目,所以我没有经验.我已经搜索过这个错误,但没有找到类似的东西.

def getpriority(chunks):
    p = 0
    for chunk in chunks:
        a = chunk.result_set.all()
        l = a.latest()
        if pytz.utc.localize(datetime.now()) - l.timestamp > datetime.timedelta(days=3):
            x = getresult(chunk)
            print(x)
Run Code Online (Sandbox Code Playgroud)

我正在尝试为我的Chunk模型分配优先级,以便我可以选择具有最高优先级的Chunk来使用该对象.

我相信我的错误在于呼唤latest()'a'.

当我在django shell中运行Chunk.result_set.latest()时,我收到以下错误:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'ReverseManyToOneDescriptor' object has no attribute 'latest'
Run Code Online (Sandbox Code Playgroud)

在我的Result模型中,我设置了get_latest_by,我认为需要运行.latest():

class Result(models.Model):
    rel_chunk = models.ForeignKey(Chunk, on_delete=models.CASCADE)
    score = models.IntegerField()
    timestamp = models.DateTimeField(auto_now_add=True)

    class Meta:
        get_latest_by = 'timestamp'
Run Code Online (Sandbox Code Playgroud)

我相信错误在于我在相关对象集上调用最新但如果无法在相关对象集上调用,那么如何才能找到最新的相关结果?

lev*_*evi 7

应该chunk.result_set.latest()不是Chunk.result_set.latest()

请注意,chunk应该是实例而不是类模型.


knb*_*nbk 5

该错误表明您正在访问result_set模型类上的属性。您需要在模型实例上访问它,在这种情况下,它将返回一个正确的管理器对象而不是一个ReverseManyToOneDescriptor

chunk = Chunk.objects.get(...)
chunk.result_set.latest()
Run Code Online (Sandbox Code Playgroud)

这里,chunk.result_set是一个行为与 完全一样的管理器Result.objects,除了它过滤查询集以仅包含与chunk实例相关的结果。经理也有一些额外的方法来操作之间的关系chunk,结果,比如chunk.results_set.add()chunk.result_set.remove()添加/从与此相关的结果集删除结果chunk实例。

由于这一切适用于特定实例Chunk,这是没有意义的访问一个一流水平的相关管理者。这就是为什么你需要一个Chunk实例来使用相关的管理器。

由于chunk.result_set是一个管理器实例,它代理所有查询集方法*。没有理由您需要chunk.result_set.all().latest()而不仅仅是chunk.result_set.latest().

*)delete()在管理器上被禁用,因此您不会意外删除所有对象。as_manager()被禁用,因为它对经理没有意义。