我有一个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.
任何人都有一个提示,我应该如何构建一个查询集,将所有帖子拉到一起以获取请求的状态?提前谢谢。
答案 0 :(得分:1)
我建议将Post.zipcode
更新为ForeignKey
到ZipCode
。如果你不能,你可以像这样进行查找:
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的帮助!