Dav*_*ave 6 python sql django orm python-3.x
我正在使用 Django 和 Python 3.7。我的models.py文件中有以下两个模型......
class Article(models.Model):
created_on = models.DateTimeField(default=datetime.now)
...
class ArticleStat(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, )
elapsed_time_in_seconds = models.IntegerField(default=0, null=False)
Run Code Online (Sandbox Code Playgroud)
我想编写一个 Django ORM 查询,其中我选择的文章具有至少 5 分钟(300 秒)旧的统计信息。但是,我不知道如何从 Article 对象中引用 ArticleStat 对象。不出所料,这
Article.objects.filter(articlestat.elapsed_time_in_seconds.lte==300)
Run Code Online (Sandbox Code Playgroud)
产生一个
NameError: name 'articlestat' is not defined
Run Code Online (Sandbox Code Playgroud)
错误。
编辑:根据答案,我将 ArticleStat 模型更改为
class ArticleStat(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='articlestats')
Run Code Online (Sandbox Code Playgroud)
然后我运行下面的查询得到显示的错误
Article.objects.filter(articlestat_set__elapsed_time_in_seconds__lte==300)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'articlestat_set__elapsed_time_in_seconds__lte' is not defined
Run Code Online (Sandbox Code Playgroud)
我想可能有一个复数的实例,所以我尝试了一个“s”,但得到了一个错误..
Article.objects.filter(articlestats_set__elapsed_time_in_seconds__lte==300)
Traceback (most recent call last):
File "<input>", line 1, in <module>
NameError: name 'articlestats_set__elapsed_time_in_seconds__lte' is not defined
Run Code Online (Sandbox Code Playgroud)
Fyn*_*ker 11
这里的核心问题是NameErrorforarticlestat所以我首先解决这个问题。
正如django 文档中所解释的,默认情况下,您的向后关系名称被定义为FOO_set在您的情况下意味着articlestat_set.
如果模型具有 a
ForeignKey,则外键模型的实例将有权访问Manager返回第一个模型的所有实例的 a 。默认情况下,其Manager名称为FOO_set,其中FOO是小写的源模型名称。
如果您喜欢不同的名称,可以通过related_name在ForeignKey定义中指定 a 来实现,例如
class ArticleStat(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='articlestats')
elapsed_time_in_seconds = models.IntegerField(default=0, null=False)
Run Code Online (Sandbox Code Playgroud)
第二个问题是如何正确遵循关系,这里对此进行了相当广泛的解释,这就是为什么我不会在这个答案中详细讨论它。要点是,而不是.您想要使用的运算符__(双下划线)。您在此查询中需要进行比较的情况也是如此field lookups。
解决这两个问题后,您的查询应如下所示:
Article.objects.filter(articlestat_set__elapsed_time_in_seconds__lte=300)
Run Code Online (Sandbox Code Playgroud)
或使用自定义related_name例如related_name='articlestats':
Article.objects.filter(articlestats__elapsed_time_in_seconds__lte=300)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3124 次 |
| 最近记录: |