Django: вытащить список записей по состоянию с помощью почтового индекса
-
09-10-2019 - |
Вопрос
У меня есть приложение Django, которое имеет серию почтовых сообщений ZIP-кода. Я хотел бы создать страницу, которая показывает все сообщения по состоянию, но не уверен, как пойти об этом. У меня есть таблица zipcode, но мое поле Post.zipcode не связано с ним (в основном потому, что он введен пользователя, и позволяет Zips, которые не находятся в БД или снаружи США).
Мои соответствующие модели:
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)
...
К сожалению, My Post.zipcode поле не является внешним ключом к Zipcode, поэтому я получаю эту ошибку, если я попробую:
FieldError at /post/state/VT/
Join on field 'zipcode' not permitted.
У кого-нибудь есть подсказки относительно того, как я должен построить запрос, который вытаскивает все сообщения вместе за запрошенное состояние? Заранее спасибо.
Решение
Я бы предложил обновить 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
было бы лучше.
Другие советы
Довольно простое решение в конце. То, что я сделал, было добавить новое поле внешнего ключа в размещение под названием местоположение, поэтому пост теперь выглядит так:
class Post(models.Model):
body = models.TextField()
zipcode = models.CharField(max_length=5)
location = models.ForeignKey(ZipCode, null=True, blank=True, default=None)
Когда я создаю новые сообщения, я проверяю, проверяя ли введенные Zip String запись в базе данных zipcode, и если она создает местоположение fk. Это затем позволяет мне сделать это на мой взгляд:
def posts_by_state(request, state):
posts = Post.objects.filter(location__statecode=state)
...
Спасибо, Сет и Сдолан за вашу помощь!