Django:使用邮政编码按州列出记录列表

时间:2011-01-11 07:26:36

标签: django django-queryset zipcode

我有一个Django应用程序,其中包含一系列标记有邮政编码的帖子。我想创建一个页面,按州显示所有帖子,但我不确定如何去做。我有一个ZipCode表,但我的Post.zipcode字段与它无关(主要是因为它是用户输入的,并允许拉链不在数据库中或来自美国以外)。

我的相关模特:

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模式传入的“state”参数,并执行以下操作:

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.

任何人都有一个提示,我应该如何构建一个查询集,将所有帖子拉到一起以获取请求的状态?提前谢谢。

2 个答案:

答案 0 :(得分: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会更好。

答案 1 :(得分: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)
   ...

谢谢Seth和sdolan的帮助!