![](/img/trans.png)
[英]How to write select query in django in chain of one-to-many relationship?
[英]How do I write a Django ORM query for the reverse relationship in a one-to-many relationship?
我正在使用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)
我想寫一個Django ORM查詢,我選擇的文章有至少5分鍾(300秒)的統計數據。 但是,我不知道如何從Article對象引用ArticleStat對象。 不出所料,這個
Article.objects.filter(articlestat.elapsed_time_in_seconds.lte==300)
生產一個
NameError: name 'articlestat' is not defined
錯誤。
編輯:根據答案,我將ArticleStat模型更改為
class ArticleStat(models.Model):
article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='articlestats')
然后我運行以下查詢顯示錯誤
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
想到也許有一個有多個的實例,所以我嘗試了一個“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
這里的核心問題是articlestat
的NameError
,所以我將首先解決這個問題。
正如django文檔中所解釋的那樣,默認情況下,您的反向關系名稱定義為FOO_set
,在您的情況下,它意味着articlestat_set
。
如果模型具有
ForeignKey
,則外鍵模型的實例將可以訪問返回第一個模型的所有實例的Manager
。 默認情況下,此Manager
名為FOO_set ,其中FOO是源型號名稱,小寫。
如果您更喜歡其他名稱,可以通過在ForeignKey
定義中指定related_name
來實現
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)
第二個問題是如何正確地遵循這里相當廣泛解釋的關系,這就是為什么我不會在這個答案中詳細討論它。 要點是而不是.
運算符要使用__
(雙下划線)。 對於此查詢中需要進行比較的field lookups
,情況也是如此。
修復這兩個問題后,您的查詢應如下所示:
Article.objects.filter(articlestat_set__elapsed_time_in_seconds__lte=300)
或與自定義related_name
例如related_name='articlestats'
:
Article.objects.filter(articlestats__elapsed_time_in_seconds__lte=300)
嘗試類似的東西:
Article.objects.filter(articlestat__elapsed_time_in_seconds__lte=300)
請注意,Django查詢的工作方式類似於關鍵字(kwargs) (即,您只能將filter_string=something
傳遞給過濾器函數)。
你傳遞了一個python無法解析的表達式(即python試圖找到articlestat
變量名,然后獲取其elapsed_time_in_seconds
屬性等)
看看這個更多https://docs.djangoproject.com/en/2.1/topics/db/queries/#retrieving-specific-objects-with-filters
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.