Django - ForeignKey () usa coluna diferente do que o ID de linha?

votos
1

Eu tenho um aplicativo chamado Localização. Localização tem País, Estado, Cidade, Big_City_Nearby, longitude, latitude.

Tenho uma aplicação para um item para vender. Item tem título, Link, Descrição, preço e localização que é um ForeignKey ().

Agora, se alguém quer ver todos os itens para venda nos EUA, eles clicam em um link (vamos dizer http://example.com/United-States/ ) ea URL vai passar no United States, como país com estado, cidade e big_city_nearby vazio.

#in view.py
class by_location(request, country, state, city, big_city_nearby)
   location = Location.objects.filter(country=country, state=state, city=city, big_city_nearby=big_city_nearby)
   items = Items.objects.filter(location__in=[location.id for loc in location])
   return render_to_response('item/by_location.html', {items:itmes, country:countyr, cit:city, nearby:big_city_nearby})

Não há nenhum problema se eles passam em ( http://example.com/United_State/California/Oakland ) como I pode ir em frente e listar todos os itens em Oakland sem necessidade de exibir a localização per itens encontrados.

O problema é quando a escolha http://example.com/United_States/ ou http://example.com/United_States/California/ . Como eu tenho que agora mostrar a localização de cada um dos itens como os itens podem ser de diferentes cidades.

Então, quando o modelo obtém a lista de itens, ele só recebe o ForeignKey (Localização) em cada item. Eu posso colocar no lugar um outro loop, onde cada item é examinado e o objeto Location é buscado e colocar em uma tupla com o objeto item. Mas isso seria muito SQL ineficiente. Como eu teria que bater o banco de dados para cada item encontrado para obter o objeto localização real.

Existe uma maneira que eu posso dizer o ForeignKey está segurando a cidade em vez do Id para a linha localização no banco de dados.

Para fazer a simples pergunta: Existe uma melhor maneira de deixar o local como um aplicativo, sem a necessidade de fornecer país, estado, cidade ... etc. em cada linha item.

THX,

VN44CA

Publicado 08/05/2009 em 19:32
fonte usuário
Em outras línguas...                            


1 respostas

votos
2

Item.objects.filter(...).select_related("location"). Este irá juntar-se contra a mesa de locais, por isso vai ser apenas uma consulta.

Mesmo melhor, Item.objects.filter(location__country=country, location__state=state).select_related("location")e você pode omitir a Locationconsulta inteiramente.

Honestamente, eu estou tendo dificuldade para descobrir se isso é tudo que você precisa, mas que manipula o O problema (n) procedimentos.

Respondeu 08/05/2009 em 20:04
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more