2016-04-22 111 views
0

我有一個訂單模式:Django的:限制models.ForeignKey結果

class Order(models.Model): 
    profile = models.ForeignKey(Profile, null=True, blank=True) 

它返回的所有可能的配置文件的命令,這是沒有必要的,因此減慢了管理秩序網頁的加載速度。

我希望簡單地返回簡單地作爲下訂單的用戶的配置文件。我試着將其更改爲:

class Order(models.Model): 
    profile = models.ForeignKey(Profile, null=True, blank=True, limit_choices_to={'order': 99999}) 

它返回訂單號99999正確的配置文件,但我怎麼能得到這個動態。 Order模型不知道「self」,但訂單號包含在URL中。

這樣做的最好方法是什麼?

+1

如果配置文件是固定的,它聽起來好像根本不應該可編輯。您可以將其設爲[只讀字段](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields),並將值設置爲[當訂單被放置](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model)。 – Alasdair

+0

您使用的是django管理員嗎? –

+0

是的,這是與django管理站點 – James

回答

0

如果您使用的是Django管理,您可以覆蓋的方法formfield_for_foreignkeyModelAdmin類修改dinamically基於例如GET參數的配置文件字段的查詢集(因爲你有方法內訪問request

看一看該文檔這個例子中(適用於您的情況):

class MyModelAdmin(admin.ModelAdmin): 
    def formfield_for_foreignkey(self, db_field, request, **kwargs): 
     if db_field.name == "profile": 
      # You can get the order number from the GET parameter: 
      # order = request.GET.get('order') 
      # or a fixed number: 
      order = '12345' 
      kwargs["queryset"] = Profile.objects.filter(order=order) 
     return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

引用文檔:https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

+0

嗯,我試着將上面的代碼添加到我的OrderAdmin類,但這只是導致504網關超時... – James

+0

雖然它的順序='12345'行,儘管附加了錯誤的配置文件 – James

+0

您可以禁用調試,查看引發504的異常是否被拋出? –

0

我把ANOT她看着這個,它似乎工作,雖然它似乎有點破解!問題在於訂單號似乎不存在於請求中,所以我正在解析請求的URL。我把這個在我的訂單管理:

def formfield_for_foreignkey(self, db_field, request, **kwargs): 
    if db_field.name == "profile": 
     try: 
      order = int(filter(str.isdigit, str(request.path_info))) 
     except: 
      order = request.GET.get('order') 
     kwargs["queryset"] = Profile.objects.filter(order=order) 
    return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs) 

,其過濾URL字符串的整數線適用於管理員的變更單頁,但對於訂購頁面概述沒有工作,所以我增加了嘗試/除外。任何建議/改進的歡迎!

0

我從上下文中假設您指的是Django Admin頁面上的顯示。如果設置 raw_id_fields = {「my_foreign_key」}

你會得到(從STR)和一個不錯的彈出框中輸入一個數字,相關模型的文字說明,打開管理頁面的一個實例爲您相關的模型。

您也可以使用 list_select_related = True 以獲得與您現在具有相同的行爲,但是具有較低數量的查詢數量級。