2011-08-31 103 views
1

我有一個模型'Objective',其中通常的方式來引用對象是由unicode方法。只使用對象的Unicode的Django過濾器模型

models.py:

class Objective(models.Model): 
    level = models.IntegerField() 
    strand = models.ForeignKey(Strand) 
    order = models.IntegerField() 
    description = models.TextField() 
    def __unicode__(self): 
     return u'%s%s%s' % (self.level, self.strand.code, self.order) 

    class Meta: 
     unique_together = ("strand", "level", "order") 
     ordering = ['level', 'strand', 'order'] 

在該模型中的一個例子對象將被稱爲例如6ssm4,在第6級ssm鏈中的第四個條目。我想通過引用這個unicode字符串來進行查找(比如說從url解析)。

urls.py:

(r'^(?P<objective>[^/]+)/$', 'display_objective'), 

我已經嘗試了所有的以下變化在views.py線(不是一次!):

def display_objective(request, objective): 
    theobjective = Objective.objects.get(unicode() = objective) 
    theobjective = Objective.objects.get(self.unicode = objective) 
    theobjective = Objective.objects.get(__unicode__ = objective) 
    theobjective = Objective.objects.get(objective__iexact = objective) 
    theobjective = Objective.objects.get(objective) 
    theobjective = Objective.objects.get(unicode() = objective) 

但如果我去http://localhost:8000/6ssm4/我在錯誤頁面輸入錯誤信息,如「關鍵字不能是表達式」或「無法解析關鍵字'自我」,選擇是:評估,描述,ID,級別,順序,鏈。

這是查找對象的合法方式,還是應該解析關鍵字?如果它是合法的,那麼正確的語法是什麼?

回答

0

ORM將過濾器左值(等號左側的東西)轉換爲SQL查找術語,這就是爲什麼它具有有限的語法。您無法將Python函數作爲SQL查找術語;數據庫對Python一無所知。

一個正確的方式做,這將是你的表中創建一個新的領域,稱之爲indexlookup,然後做到這一點:

def save(self, *args, **kwargs): 
    self.lookup = self.__unicode__() 
    super(Objective, self).save(*args, **kwargs) 

查找場成爲一個預處理成員的表; 您保存一個目標,它的查找就緒版本存儲在表中。然後,您可以:

theobjective = Objective.objects.get(lookup = objective) 

你的選擇是打破客觀成其組成部分和水平,鏈和訂單進行篩選,但是,只有當他們是足夠規則的正則表達式的作品。

這是程序員時間與響應與存儲的比較(選擇二)的典型折衷。在這種情況下,我已經做出了這樣的呼籲:程序員的時間和響應性對於存儲的考慮更重要。

+0

謝謝。我做了你在新領域所說的話,然後花了幾秒鐘的時間「爲了o的目標:o.save()'而我完成了。可愛的修復。 – nimasmi

+0

這是一個非常聰明的移民!恭喜。你在南方還是手工做過? –

+0

「在南方做」?我不明白。我應該在python shell中完成它,但實際上我暫時修改了我的視圖函數,因爲它在那裏和方便。 – nimasmi