0

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

私の関連モデル:

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

私のDjangoビューでは、URLパターンから渡された「状態」パラメーターを取得して、次のようにしたいと思います:

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

残念ながら、私の Post.zipcode フィールドは ZipCode の外部キーではないため、試してみると次のエラーが発生します。

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

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

4

2 に答える 2

1

に更新Post.zipcodeすることをお勧めForeignKeyZipCodeます。できない場合は、次のようにルックアップを実行できます。

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

ちなみに、ZipCodeそのモデルの正しい名前ではないようです。おそらくLocationもっと良いでしょう。

于 2011-01-11T07:42:26.790 に答える
0

最終的にはかなり簡単な解決策。私がしたことは、ロケーションと呼ばれる新しい外部キー フィールドを Post に追加したため、Post は次のようになります。

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

新しい投稿を作成するときは、入力した zip 文字列が ZipCode データベースのレコードと一致するかどうかを確認し、一致する場合は場所の FK を作成します。これにより、私の見解でこれを行うことができます。

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

セスとスドラン、助けてくれてありがとう!

于 2011-01-13T07:27:23.683 に答える