2011-01-11 66 views
0

我有一個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. 

任何人都有一個提示,我應該如何構建一個查詢集,將所有帖子都拉到一個請求的狀態?先謝謝你。

+1

如果您可以修改模型,則可以更快地將狀態字段添加到Post模型中。當創建一個帖子時,快速查看ZipCode表以獲取狀態。 – Seth 2011-01-11 07:37:49

+0

謝謝Seth,我只是在考慮自己。最終,我打算使用Lat和Long來執行基於郵政編碼的半徑查找,並且我將遇到同樣的問題。想知道是否需要使Post.zipcode成爲一個真正的ForeignKey,以及如果用戶想用不在我的ZipCode數據庫中的zip標記帖子,這將意味着什麼。 – mitchf 2011-01-11 07:41:44

回答

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會更好。

0

最後很簡單的解決方案。我所做的就是添加一個新的外鍵字段,以發佈所謂的位置,以便郵政現在看起來是這樣的:

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的幫助!