0

我有一个 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 模式传入的“状态”参数并执行以下操作:

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.zipcodeForeignKeyto ZipCode。如果你不能,你可以像这样进行查找:

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 添加一个名为 location 的新外键字段,因此 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 回答