2014-05-09 3 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.filter (책 = BOOK_NAME)'? –

+0

이것은 만들어진 예입니다. 다른 모델 조회를 수행하지 않고 실제 모델을 검색하고 키로 사용하기가 어렵습니다. – joeButler

+0

구체적인 예를 제공하십시오. –

답변

1

아니요, 더 효율적인 방법은 없습니다. 이 경우 데이터베이스를 사용하여 검색 할 수 있습니다.이 경우 모델의 필드를 검색해야하며 그렇지 않으면 수행중인 것처럼 Python을 사용하여 반환 된 행을 검색 할 수 있습니다. 그러나

, 당신의 문자열을 거의 확실하게 -

(. 기본적으로 인덱스로 사용하여 다음 데이터베이스에서 모델 자체에 문자열을 저장하고, 어떤 사람들이 사용하는이 주위에 한 가지 방법은 비정규//입니다) 모델에있는 필드에 대해 일부의 관계가 있습니다. 이상적으로는이 필드에 의해 완전히 결정됩니다. 그게 사실이라면 필드가 무엇인지 결정하기 위해 얻은 문자열을 구문 분석 한 다음 해당 값을 기반으로 데이터베이스에서 조회를 수행 할 수 있습니다.

예제 코드 :

방법`Book.objects.get (이름 = BOOK_NAME)에 대한
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

테이블이 어떤 테이블인지 나타내는 경우이를 찾아 볼 필요가 없습니다. 외래 키는 자동으로 인덱싱되어야합니다. 데이터베이스는 테이블 조인에 능숙합니다. –

관련 문제