2014-05-09 2 views
0

J'ai maintenant une fonction pour trouver une instance de modèle basée sur la correspondance de la chaîne renvoyée par le modèle. Ce n'est évidemment pas efficace. Je me demandais si Django avait une méthode pour trouver une instance de modèle basée uniquement sur la chaîne plutôt que par filtrage par les attributs de l'instance.Trouver une instance de modèle par chaîne dans Django

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

que diriez-vous 'Book.objects.get (name = book_name)' 'ou Book.objects.filter (livre = book_name)'? –

+0

C'était un exemple inventé. Il est difficile de chercher sur le modèle réel sans faire quelques autres recherches de modèles et de les utiliser comme des clés – joeButler

+0

Fournissez un exemple concret alors. –

Répondre

1

Non, il n'y a aucun moyen de le faire plus efficacement; Vous pouvez effectuer une recherche en utilisant la base de données, auquel cas vous devez rechercher les champs dans le modèle, ou vous pouvez rechercher les lignes retournées en utilisant Python, comme vous le faites.

(Une façon de contourner ce que certaines personnes utilisent est/dénormalisation/-. Sauver essentiellement la chaîne avec le modèle lui-même dans la base de données, puis l'utiliser comme un indice)

Cependant, votre chaîne presque certainement a certains par rapport aux champs qui sont dans le modèle - idéalement, il est entièrement déterminé par eux. Si cela est vrai, vous pouvez alors analyser la chaîne que vous obtenez pour déterminer ce que les champs doivent être, puis effectuer une recherche dans la base de données en fonction de ces valeurs.

code Exemple:

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

Oui, la chaîne a une certaine valeur, elle est composée de quelques clés étrangères dont j'ai besoin Rechercher chacun d'eux pour arriver au point où je pourrais faire un appel object.get. – joeButler

+0

Vous n'avez peut-être pas besoin de les rechercher si vous connaissez les tableaux qu'ils représentent. Les clés étrangères doivent être indexées automatiquement. Les bases de données sont bonnes pour joindre des tables. –

Questions connexes