簡體   English   中英

如何在一對多關系中為反向關系編寫Django ORM查詢?

[英]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

這里的核心問題是articlestatNameError ,所以我將首先解決這個問題。

正如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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM