2011-01-11 4 views
0

Ich habe eine Django App, die eine Reihe von Postleitzahlen mit Tags hat. Ich möchte eine Seite erstellen, auf der alle Posts nach Status angezeigt werden, ich bin mir jedoch nicht sicher, wie ich vorgehen soll. Ich habe eine ZipCode-Tabelle, aber mein Post.Zipcode-Feld ist nicht damit verwandt (hauptsächlich weil es Benutzer eingegeben wird, und erlaubt Reißverschlüsse, die nicht in der DB oder von außerhalb der USA sind).Django: Liste der Datensätze nach Staat mit Postleitzahl

Meine relevanten Modelle:

class Post(models.Model): 
    body = models.TextField() 
    zipcode = models.CharField(max_length=5) 

class ZipCode(models.Model): 
    zipcode = models.CharField(max_length=5) 
    city = models.CharField(max_length=64) 
    statecode = models.CharField(max_length=2) 
    statename = models.CharField(max_length=32) 
    latitude = models.FloatField() 
    longitude = models.FloatField() 

In meinem Django Ansicht Ich würde gerne den "Zustand" Parameter nehmen, die in meiner URL-Muster übergeben wird und etwas tun, wie folgt aus:

def posts_by_state(request, state): 
    posts = Post.objects.filter(zipcode__statecode=state) 
    ... 

Leider ist mein Post.zipcode Feld kein Fremdschlüssel ZipCode so dass ich diesen Fehler, wenn ich versuche:

FieldError at /post/state/VT/ 
Join on field 'zipcode' not permitted. 

Jeder hat einen Hinweis, wie ich ein Abfrage-Set erstellen soll, das alle Beiträge für einen angeforderten Status zusammenfasst? Vielen Dank im Voraus.

+1

Wenn Sie Ihr Modell ändern können, ist es möglicherweise schneller, dem Post-Modell ein Zustandsfeld hinzuzufügen. Wenn ein Post erstellt wird, suchen Sie schnell in der ZipCode-Tabelle nach, um den Status zu erhalten. – Seth

+0

Danke Seth, ich habe gerade darüber nachgedacht. Irgendwann werde ich PLZ-basierte Radius-Lookups mit Lat und Long machen wollen und ich werde das gleiche Problem haben. Ich frage mich, ob ich Post.zipcode einen echten ForeignKey machen muss und was das bedeutet, wenn Benutzer einen Beitrag mit einer Zip-Datei versehen wollen, die nicht in meiner ZipCode DB ist. – mitchf

Antwort

1

Ich würde vorschlagen, Post.zipcode zu aktualisieren, um ein ForeignKey zu ZipCode zu sein. Wenn Sie nicht, können Sie die Lookup wie dies tun könnten:

zipcodes = [zip_code.zipcode for zip_code in ZipCode.objects.filter(statecode=state)] 
posts = Post.objects.filter(zipcode__in=zipcodes) 

Auf einer Seite zur Kenntnis, nicht ZipCode nicht für dieses Modell wie der richtigen Namen zu sein scheint. Vielleicht wäre Location besser.

+0

Danke sdolan. Sie haben sicherlich Recht auf den Modellnamen. – mitchf

+1

Kein Problem. Verursacht die Abfrage, die ich gepostet habe, dein Problem nicht? Mir ist klar, dass dies nicht der effizienteste Weg ist, aber es wird funktionieren und ist sehr anfällig für Caching, wenn es ein Problem wird. – sdolan

+0

Haben Sie einfach Ihre Abfrage versucht und es funktioniert, solange der Staat nicht zu viele Reißverschlüsse hat. Wenn ich versuche, Posts für einen Staat wie Kalifornien zu laden, bekomme ich einen Fehler "DatabaseError at/will/state/CA/zu viele SQL-Variablen". Nächster Schritt: Versuchen Sie, einen FK zu ZipCode hinzuzufügen. – mitchf

0

Ziemlich einfache Lösung am Ende. Was ich tat, war ein neues Fremdschlüsselfeld hinzuzufügen genannt Standort Sandte so jetzt Beitrag wie folgt aussieht:

class Post(models.Model): 
    body = models.TextField() 
    zipcode = models.CharField(max_length=5) 
    location = models.ForeignKey(ZipCode, null=True, blank=True, default=None) 

Wenn ich neue Beiträge erstellen, ich überprüfe, um zu sehen, ob der eingegebene ZIP-String einen Datensatz in der ZipCode Datenbank übereinstimmt und wenn es das tut, erstelle ich den Ort FK. Dies ermöglicht mir dann, dies aus meiner Sicht zu tun:

def posts_by_state(request, state): 
    posts = Post.objects.filter(location__statecode=state) 
    ... 

Vielen Dank Seth und sdolan für Ihre Hilfe!