2016-07-19 10 views
2

Ich habe folgendes Modell:django Filter queryset basierend auf __str__ von Modell

class Subspecies(models.Model): 
    species = models.ForeignKey(Species) 
    subspecies = models.CharField(max_length=100) 

    def __str__(self): 
     return self.species.species_english+" "+self.species.species+" "+self.subspecies 

    def __unicode__(self): 
     return self.species.species_english+" "+self.species.species+" "+self.subspecies 

bemerkt, dass das ForeignKey Feld species in den __str____unicode__ und Methoden verwendet. Ich hatte diese Filterabfrage gemacht:

l = list(Subspecies.objects.filter(subspecies__contains=request.GET.get('term')).order_by('subspecies')[:10]) 

Das ist fast was ich will, außer nicht ganz. Was ich wirklich will, ist ein Filter, der überprüft, ob die __str__ Darstellung des Objekts eine Gruppe von Zeichen enthält, anstatt nur das subspecies Feld zu überprüfen. Anstelle von subspecies__contains=... wäre es so etwas wie __str____contains=..., aber das funktioniert natürlich nicht.

Ist das möglich? WENN, wie würde ich diese Abfrage machen?

Danke!

+1

Warum können Sie nicht einfach auf die drei Felder im zugehörigen Modell filtern? – e4c5

+0

Ja, das ist, was ich getan habe, würde ich lieber in der Lage sein, die ganze Phrase zusammen zu suchen, aber mit OR separat filtern ist fast OK. –

Antwort

3

Der Filter generiert eine Abfrage, die im DB ausgeführt werden soll.

__str__ wird im Python-Interpreter ausgeführt. Sie können es nicht von der DB aus aufrufen. SO ist die kurze Antwort "Nein, du kannst nicht". Sie müssen es manuell filtern, z. B. mit der integrierten Funktion filter.

+0

Danke dafür. Ich hatte Angst davor. Dieses Modell enthält 20K-Zeilen. Ich habe das in der Shell versucht, aber es hat einige Zeit gedauert. '[i für i in Subspecies.objects.all() wenn 'aur' in Unicode (i)]' Die DB-Filtermethode ist sehr schnell. Wahrscheinlich wird es für das Web zu langsam sein. –

+0

ähnliche schlechte Leistung mit: 'a = Filter (Lambda x: 'aur' in Unicode (x), an objects.all())': -/ –

+0

Sie können Raw SQL-Ausdruck verwenden, um eine solche Abfrage, etw '... WO art_deutsch || Arten || Unterarten CONTAINS ... ' –