2012-03-17 66 views
0

Django/Python新手在這裏。django - 過濾模型默認表示

讓我們用示例表從Django的書此頁上:http://www.djangobook.com/en/2.0/chapter10/

class Author(models.Model): 
    first_name = models.CharField(max_length=30) 
    last_name = models.CharField(max_length=40) 
    email = models.EmailField() 

    def __unicode__(self): 
     return u'%s %s' % (self.first_name, self.last_name) 

下面是用於訪問作者表爲例篩選​​語句:

a = Author.objects.get(first_name='Adrian', last_name='Holovaty') 

,如果我不」什麼t在單獨的變量中有姓氏和名字嗎?如果我只有整個名字,怎麼辦?我想要做這樣的事情:

aName = 'Adrian Holovaty' 
a = Author.objects.get(Author.self=aName) 

我期待訪問對象表示「屬性」不知何故。當然,我可以在空間上分割一個名稱並按照上面的方式進行查找。但如果不清楚如何分割全名呢?假設我試圖分裂像「紐約尼克斯」或「Rip Van Winkle」之類的東西?在第一個例子中,first_name是「紐約」,第二個是「Rip」。

+1

所以......你問哪個問題? – 2012-03-17 16:52:06

+0

我想訪問過濾器中的__unicode __(self)「屬性」,或者在表格中獲取。 – Cromulent 2012-03-17 17:33:35

回答

1

你不能這樣做的原因是,__unicode__在使用Python通過查詢集的SQL選擇的數據進行評估,

因此,數據庫無法預測Python方法__unicode__生成的值。

這就是說,有很多方法:

  1. 如果依靠django-haystack搜索,那麼你可以把{{ object }}這是object.__unicode__模型類的模板的結果。然後,您可以通過__unicode__輸出啓用搜索。

  2. 一個cached_unicode CharField添加到模型中,使用pre_save signal receiver(覆蓋save() method)更新self.cached_unicode,那麼你就可以過濾(cached_unicode = '富酒吧')

  3. 使用SQL CONTACT(author.first_name ,「」,author.last_name)=「富酒吧」要麼Author.objects.raw()要麼author_queryset.extra()

+0

感嘆。必須有一個更簡單的方法。我真的很希望能夠做到「a = Author.objects.get(first_name + last_name ='Adrian Holovaty')」,但會得到一個「關鍵字」錯誤。 – Cromulent 2012-03-17 17:56:24

+0

你處理了多少個'Authors'?您可以將查詢字符串拆分爲空格,並對每個可能的姓氏執行多個查找。對於匹配的'Authors',檢查__unicode__'表示是否匹配完整的查詢名稱。它不如單個數據庫查找好,但出於您的目的,它可能很好,而且足夠快。 – 2012-03-17 18:12:41

+0

我以爲你是在尋求一種通用的方式......所以我添加了兩個解決方案,它們在你知道__unicode__如何預先構建的情況下工作(即你知道它是名字空間姓氏的連接)。感謝您的反饋意見! – jpic 2012-03-17 18:43:11

0

只需添加一個getbyname方法,你的類拆分名和peforms查詢。任務完成。

+0

但是如果你不知道*在哪裏分割名字,你怎麼分割名字?此外,我無法追蹤「getbyname」。 – Cromulent 2012-03-18 14:18:04

+0

@Cromulent直到你寫下它纔會找到它。至於分裂,那是你設計的。 – Marcin 2012-03-18 16:33:19