Django: вытащить список записей по состоянию с помощью почтового индекса

StackOverflow https://stackoverflow.com/questions/4655183

  •  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)
   ...

Спасибо, Сет и Сдолан за вашу помощь!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top