2014-05-09 20 views
0

我現在有一個函數可以根據匹配模型返回的字符串來查找模型實例。這顯然不是有效的。我想知道Django是否有一種方法僅基於字符串來查找模型實例,而不是通過實例屬性進行過濾。在Django中通過字符串查找模型實例

def parse_book(book_name): 
    for book in Book.objects.all(): 
     if str(book) == book_name: 
      return book 
+0

怎麼樣'Book.objects.get(名稱= BOOK_NAME)'或'Book.objects.filter(書= BOOK_NAME)'? –

+0

這是一個製作的例子。如果不進行其他模型查找並將它們用作鍵,很難在真實模型上進行搜索 – joeButler

+0

然後提供一個具體示例。 –

回答

1

不,沒有辦法更有效地做到這一點;您可以使用數據庫進行搜索,在這種情況下,您需要搜索模型中的字段,也可以使用Python搜索返回的行,就像您正在做的那樣。

(一個解決此,一些人使用的方法是/非規範化/ - 本質上節省了字符串模型本身在數據庫中,然後用它作爲索引)

然而,您的字符串幾乎肯定有一些與模型中的字段的關係 - 理想情況下,它完全由它們決定。如果這是真的,那麼你可以解析你得到的字符串來確定字段應該是什麼,然後根據這些值在數據庫中進行查找。

示例代碼:

class Book(models.Model): 
    title = models.CharField(max_length=200) 
    author = models.CharField(max_length=200) 

    def __str__(self): 
     return self.title + ": " + self.author 

def parse_book(book_name): 
    title, author = book_name.split(": ", 1) 
    try: 
     return Book.objects.get(title=title, author=author) 
    except Book.DoesNotExist: 
     return None 
+0

是的,字符串確實有一些價值,它由我需要的一些外鍵組成查找他們每一個到達我可以做一個object.get調用的點。 – joeButler

+0

如果你知道它們代表什麼表,你可能不需要查看它們。外鍵應自動編入索引。數據庫擅長連接表。 –

相關問題