2016-11-18 4 views
0

Afin de mettre en pratique ce que j'ai appris j'ai commencé un projet django sur un site immobilier.django - construire un filtre pour un projet immobilier

L'étape suivante consiste à construire la page de recherche où l'utilisateur peut sélectionner multiple filters, pour exemple, number of rooms, baths, area, city ...

Au livre que je lis j'ai utilisé les moteurs de recherche (SORL avec django haystack), donc je me demande si je devrais l'utiliser pour filtrer les conditions d'utilisateur sur le DB, ou si je devrais le garder simple en utilisant seulement des requêtes de djando avec beaucoup de ifs.

Que me suggérez-vous?

Répondre

2

On ne sait pas très bien ce que vous demandez, mais en général, je recommande d'utiliser le filtre de Django car il est très puissant.

Disons que l'utilisateur sélectionne les options pour leur maison sur une page de formulaire et vous obtenez les informations avec

number_of_rooms = request.GET.get('number_of_rooms', 0) 
area = request.GET.get('area', 0) 

Vous auriez pas besoin des « si », mais plutôt une requête de filtre concis:

matching_house = Houses.objects.filter(number_of_rooms__gte=number_of_rooms, area__gte=area) 

Ceci retournerait toutes les maisons avec au moins autant de pièces que l'utilisateur le souhaite, et au moins autant de surface.

Vous pouvez également permettre à l'utilisateur d'entrer une plage pour le nombre de chambres et de la zone:

min_number_of_rooms = request.GET.get('min_number_of_rooms', 0) 
max_number_of_rooms = request.GET.get('max_number_of_rooms', 0) 
min_area = request.GET.get('min_area', 0) 
max_area = request.GET.get('max_area', 0) 

Et puis étendre simplement les conditions de filtre en conséquence:

matching_house = Houses.objects.filter(number_of_rooms__gte=min_number_of_rooms, number_of_rooms__lte=max_number_of_rooms, area__gte=min_area, area__lte=max_area) 

etc.

Vous pouvez en savoir plus à ce sujet dans le Django QuerySet API Reference

2
from django.db.models import Q 

search_results = Property.objects.filter(Q(room_no=no_of_rooms_val)| Q(bath_room_no=no_of_bath_rooms_val)| Q(area=area_value)| Q(city__exact=city_val)) 

Detailed explanation of Django Q

+0

S'il vous plaît élaborer un peu afin que le PO peut comprendre pourquoi vous devriez le faire. – Surt

+0

@Surt Filtre de base renverrait le jeu de requête basé sur la combinaison de & operator. Les objets Q peuvent renvoyer le jeu de requête basé sur le combiné en utilisant le & et | les opérateurs. –

+0

@IbrahimK Ajoutez une explication sur les objets 'Q' dans votre réponse. Cela aidera le PO à comprendre votre réponse. Si le lien donné change à un moment donné, cela n'aidera pas les autres. – arulmr

3

Je pourrais comprendre votre question partiellement. D'après mon expérience personnelle, je suggère d'utiliser des filtres Django.

Tenir compte, si vous avez les filtres de recherche suivants:

  1. Nombre de chambres dans la gamme (. C.-à-min_rooms = 2, max_rooms = 5)
  2. Nombre de bains dans la liste (par exemple, salles de bains. = [2, 3])
  3. villes dans la liste (ie., villes = [Chennai, Bangalore, Hyderabad])

Ensuite, vous pouvez utiliser une seule requête comme

search_results = Property.objects.filter(no_of_rooms__gte=min_rooms, no_of_rooms__lte=max_rooms, no_of_bath_rooms__in=baths, city__in=cities) 

La requête ci-dessus renvoie des propriétés avec toutes les 3 conditions satisfaites (ie., Chaque objet de la propriété aura des chambres entre 2 à 5, 2 ou 3 bains & de la ville de Chennai/Bangalore/Hyderabad)