2017-07-06 108 views
1

我的生產服務器上有一個奇怪的行爲。當我試圖通過逆轉外鍵過濾,然後我收到一個錯誤,這是不可能的,但在本地能正常工作,如:Django ORM無法通過反向外鍵過濾

class Foo(models.Model): 
    pass 

class Bar(models.Model): 
    name = models.CharField() 
    foo = models.ForeignKey('Foo', related_name='bars', blank=True, null=True, default=None) 

現在要做的:

Foo.objects.filter(bars__name=xyz) 

將導致與

無法將關鍵字'bars'解析爲字段。選項包括:...

我使用Ubuntu 16.04和Django的1.8.7

編輯1: 能不能與該ForeignKeys使用字符串表示定義的事實呢?

編輯2: 我發現關係是用class not string來定義的,所以它不適用於這樣的關係。

基本上模型Foo有很多ForeignKey的關係。在Foo很少,在目標模型很少。從Foo角度運行查詢時,這些目標模型在生產時不存在。這些在Foo可以用作查詢參數。

編輯3: 我收到了更詳細的服務器配置信息以及何時發生錯誤。

信息有關的生產設置,其中的問題被認爲是:

  • Apache的版本:2.4.18-2ubuntu3.3
  • 中的libapache2-MOD-WSGI版本:4.3.0-1.1build1

阿帕奇mpm_event配置:

StartServers 2 
MinSpareThreads 25 
MaxSpareThreads 75 
ThreadLimit 64 
ThreadsPerChild 25 
MaxRequestWorkers 150 
MaxConnectionsPerChild 0 

Apache站點配置的有關部分:

WSGIDaemonProcess some_name group=some_name maximum-requests=1000 processes=2 threads=15 user=some_name 
WSGIProcessGroup some_name 
WSGIScriptAlias/"/usr/lib/python2.7/dist-packages/some_name/wsgi.py" 
WSGIPassAuthorization On 

基本上每個請求都不會發生錯誤。當它出現時,它來自一名工人。重新啓動Apache修復了一段時間的錯誤。

其中一個想法是,在加載Django模型時可能存在競爭條件。

+0

的'fk'應該是'Foo'和相關的名稱'bars' –

+1

應該是雙向的。 Withouth related_name查詢應該是過濾器(bar_set__name = xyz) – szaman

+0

什麼是更多的本地一切似乎都很好。 – szaman

回答

1

您還沒有定義fk正確:

class Foo(models.Model): 
    pass 

class Bar(models.Model): 
    name = models.CharField() 
    foo = models.ForeignKey(Foo, related_name='bars', blank=True, null=True, default=None) 

爲了應對進口通告:

foo = models.ForeignKey('<app_name>.Foo', related_name='bars', blank=True, null=True, default=None) 
+1

哦,你是對的,我在僞代碼中犯了錯誤。現在糾正了。 – szaman

+0

Cool =)直接傳遞'Foo'而不是字符串。 –

+0

有問題,我們有很多的模型,並有循環進口 – szaman

1

您必須在您的查詢過濾器中使用related_query_name。默認在Django 1中。8它的型號名稱,因此設置自定義related_query_name或更改您的代碼如下:

Foo.objects.filter(bar__name=xyz) 
+0

:用於來自目標模型的反向過濾器名稱的名稱。如果設置,它默認爲related_name或default_related_name的值,否則默認爲模型的名稱。 – szaman

+1

因此它應該與定義的related_name一起工作,但值得嘗試。 – szaman

+0

@Dima Kudosh'related_name'絕對有效。這是我在我的代碼中始終使用的,從未遇到過問題。 –