2017-01-05 6 views
-1

Ich habe eine Liste zum Beispiel:Abfrage in django auf Basis einer Liste

home_type = ["villa", "apartment", "flat"] 

Und ich möchte, dass meine Objekte in meiner Datenbank abzufragen:

agencies = Agency.objects.filter(home_type_available__contains= home_type) 

Ich denke, es ist ein Problem mit meinem Abfrage. Ich möchte alle Agenturen, die mindestens eine der home_type in ihrem home_type_available enthalten. home_type_available kann beispielsweise so aussehen:

["apartment", "camping-car", "mobile-home"] 

Und wenn die home_type und home_type_available gemeinsam mindestens ein Element haben möchte ich diese Agentur haben.

Das ist meine Agentur Modell:

class Agency(AbstractUser): 
    .... 
    home_type_choices = (("apartment", "Apartment"), ("villa", "Villa"), ("camping", "Camping"), ("flat", "Flat") ... ("camping_car", "Camping-car")) 
    home_type_available = MultiSelectField(choices= home_type_choices) 
    AbstractUser.email = models.EmailField() 
    .... 
+0

Was ist 'Agency.home_type_available' eigentlich? Bitte posten Sie Ihre Modelle. –

+0

es ist eine Liste von home_type wie: ["apartments", "camping-car", "mobile-home"] – mel

+0

Eine Liste? Du meinst es ist kein Modellfeld ??? __Please__ poste deinen Modellcode, sonst könnte das Ratespiel für immer dauern. –

Antwort

2

MultiSelectField ist kein eingebautes Feld, aber from the doc, können wir sehen, dass es "speichert als CharField der kommagetrennten Werte in die Datenbank".

Dies ist ein schreckliches relationales DB Design-Antipattern, da es Sie davon abhält, einfache, genaue und effiziente Abfragen des Inhalts dieses Feldes durchzuführen.

Die richtige Lösung ist, Ihr Design zu einem Paar von Modellen (Agentur und HomeType) mit einem many to many relationship zu ändern (der Link erklärt alles, so dass ich mich nicht darum kümmern werde, ein konkretes Beispiel zu geben).

Ich gehe davon aus, dass sich Ihr Projekt noch in der Entwicklung befindet, daher sollte die Korrektur und Migration relativ einfach sein. Glauben Sie mir, es später zu tun (sobald es in der Produktion ist) könnte viel schmerzhafter sein, und Sie müssen diese Änderung sowieso machen.

3

An der Stelle des enthält Sie müssen in .Because enthält vergleicht Feld mit Streichern, aber wenn Sie ein Feld in der Liste suchen müssen, Sie dann verwenden sollte:

your_list = ['1','2','3','4'] 
your_objects = Your_Model.objects.filter(field__in = your_list) 

verwenden Sie diese nach Ihren Code:

home_type = ["villa", "apartment", "flat"] 
agencies = Agency.objects.filter(home_type_available__in = home_type) 

EDIT:

Wenn home_type_available a MultiSelectField Feld, dann müssen Sie eine komplexe Logik, um das gewünschte Ergebnis zu erhalten.

agency_list = [] 
home_type = ["villa", "apartment", "flat"] 
agencies = Agency.objects.all() 

for agency in agencies : 
    for item in agency.home_type_available : 
     if item in home_type : 
      agency_list.append(agency) 

print agency_list 

agency_list wird eine Liste von Agentur Modellobjekte mit atleast ein home_type_available Feld in der Liste home_type enthalten. Vielen Dank.

+1

Das OP gab an, "alle Agenturen, die mindestens einen der home_type in ihrem home_type_available enthalten" - was darauf hinweist, dass es mehr als einen Wert in "home_type_available" gibt. IOW solange wir die Modelldefinitionen nicht sehen, ist jede Antwort eine wilde Vermutung. –

+1

@brunodesthuilliers Ja, es ist durchaus möglich. –

+0

@brunodesthuilliers Sie hatten absolut Recht. Diese Art von Wissen stammt aus langer Erfahrung. Ich bin nur ein Anfänger. Aktualisierung meiner Antwort –

Verwandte Themen