Pregunta

Tengo una aplicación Django que tiene una serie de mensajes etiquetados código postal. Me gustaría crear una página que muestra todos los mensajes de estado, pero no estoy seguro de cómo hacerlo. Tengo una mesa ZipCode, pero mi campo Post.zipcode no está relacionado con ella (sobre todo porque se introduce el usuario, y permite una rápida recorrida que no están en la base de datos o desde fuera de los EE.UU.).

Mis modelos relevantes:

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()

En mi Django ver Me encantaría tener el parámetro "estado" que se pasa de mi patrón de URL y hacer algo como esto:

def posts_by_state(request, state):
    posts = Post.objects.filter(zipcode__statecode=state)
    ...

Por desgracia, mi campo Post.zipcode no es una clave externa a ZipCode por lo que obtener este error si intento:

FieldError at /post/state/VT/
Join on field 'zipcode' not permitted.

Alguien tiene una pista sobre cómo debería construir un conjunto de consultas que tira todos los mensajes juntos por un Estado requerido? Gracias de antemano.

¿Fue útil?

Solución

Me gustaría sugerir Post.zipcode actualización a ser un ForeignKey a ZipCode. Si no puede usted podría hacer la consulta de la siguiente manera:

zipcodes = [zip_code.zipcode for zip_code in ZipCode.objects.filter(statecode=state)]
posts = Post.objects.filter(zipcode__in=zipcodes)

En una nota lateral, ZipCode no parece ser el nombre correcto para ese modelo. Tal vez Location sería mejor.

Otros consejos

solución bastante fácil en el extremo. Lo que hice fue agregar un nuevo campo de clave externa a Post llamó ubicación, así Publica ahora se ve así:

class Post(models.Model):
   body = models.TextField()
   zipcode = models.CharField(max_length=5)
   location = models.ForeignKey(ZipCode, null=True, blank=True, default=None)

Cuando creo nuevos mensajes, puedo comprobar para ver si la cadena postal introducido coincide con un registro en la base de datos ZipCode, y si lo hace que crear la ubicación FK. Esto permite que haga esto en mi opinión:

def posts_by_state(request, state):
   posts = Post.objects.filter(location__statecode=state)
   ...

Gracias Seth y sdolan por su ayuda!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top