Django:使用邮政编码拉状态记录列表

我有一个Django应用程序,它有一系列邮编标记的帖子。我想创建一个按州显示所有帖子的页面,但不知道如何处理。我有一个ZipCode表,但我的Post.zipcode字段与它无关(主要是因为它是用户输入的,并且允许不在数据库中或来自美国以外的zip)。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()

在我的Django的观点我很乐意采取从我的URL模式通过在“状态”参数做这样的事情:

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.

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

回答:

我建议将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会更好。

回答:

最后很简单的解决方案。我所做的就是添加一个新的外键字段,以发布所谓的位置,以便邮政现在看起来是这样的:

class Post(models.Model): 

body = models.TextField()

zipcode = models.CharField(max_length=5)

location = models.ForeignKey(ZipCode, null=True, blank=True, default=None)

当我创造新的帖子,我检查,看看是否输入拉链字符串中的邮编数据库中的记录相匹配,如果它是我创建的位置FK。这允许我在我看来这样做:

def posts_by_state(request, state): 

posts = Post.objects.filter(location__statecode=state)

...

谢谢赛斯和sdolan的帮助!

以上是 Django:使用邮政编码拉状态记录列表 的全部内容, 来源链接: utcz.com/qa/266714.html

回到顶部