2011-01-11 29 views
0

郵便番号の付いた一連の郵便番号付きのDjangoアプリがあります。私は州ごとにすべての投稿を表示するページを作成したいと思いますが、その方法についてはわかりません。私はZipCodeテーブルを持っていますが、私のPost.zipcodeフィールドはそれに関連していません(主にユーザが入力したもので、DB内や米国外のzipを許可しているためです)。Django:郵便番号

私の関連モデル:私は私のURLパターンから渡される「状態」のパラメータを取り、このような何かをしてみたい私のDjangoのビューで

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() 

def posts_by_state(request, state): 
    posts = Post.objects.filter(zipcode__statecode=state) 
    ... 
私がしようとした場合、私はこのエラーが出るよう

は残念ながら、私のPost.zipcodeフィールドは、郵便番号への外部キーではありません。

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

要求された状態のためにすべての投稿をまとめてクエリーセットを構築する方法についてのヒントはありますか?前もって感謝します。

+1

モデルを変更できる場合は、ポストモデルに状態フィールドを追加する方が早い場合があります。投稿が作成されたら、ZipCodeテーブルをすばやく調べて状態を取得します。 – Seth

+0

セスありがとう、私はちょうど自分自身を考えていた。最終的には、緯度と経度を使用して郵便番号ベースの半径ルックアップを行いたいと思います。同じ問題が発生します。私がPost.zipcodeを本当のForeignKeyにする必要があるのか​​どうかと、ユーザーが私のZipCode DBにないzipで投稿にタグを付けることを望んでいる場合はどうなるのだろうかと思います。 – mitchf

答えて

1

Post.zipcodeForeignKeyからZipCodeに更新することをおすすめします。あなたはこのような検索を行うことができないことができる場合:サイドノートでは

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

を、ZipCodeは、そのモデルのための右の名前のように見えるしていません。おそらくLocationが良いでしょう。

+0

ありがとうsdolan。あなたはモデル名に間違いないでしょう。 – mitchf

+1

問題ありません。私が投稿したクエリはあなたの問題を解決できないのですか?私は、それが最も効率的なやり方ではないことを認識していますが、問題が発生した場合には動作し、キャッシングに非常に敏感です。 – sdolan

+0

あなたのクエリを試してみましたが、状態があまりにも多くない場合は動作します。カリフォルニア州のような州の投稿を読み込もうとすると "DatabaseError at/want/state/CA /あまりにも多くのSQL変数"というエラーが出ます。次のステップ:ZipCodeにFKを追加してみてください。 – mitchf

0

最後はかなり簡単な解決策です。私がやったことのポストは次のようになりますように、と呼ばれる場所を投稿するために、新しい外部キーフィールドを追加しました:

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

私は新しい投稿を作成するときに、私は、入力されたzip文字列は郵便番号データベース内のレコードと一致するかどうかを確認します、もしそうなら、私は位置FKを作成します。そして、これは私が私の見解でこれを行うことができます:

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

はあなたの助けセスとsdolanありがとうございます!