2013-02-21 28 views
8

Tôi đang cố gắng viết truy vấn Django sẽ chỉ khớp với toàn bộ từ. Dựa trên câu trả lời here, tôi đã thử một cái gì đó như:Kết hợp toàn bộ từ chỉ trong truy vấn Django

result = Model.objects.filter(text__iregex='\bsomeWord\b') 

Nhưng điều này không trả về kết quả mong đợi. Tôi cũng đã thử

result = Model.objects.filter(text__iregex=r'\bsomeWord\b') 

không có kết quả. Mục tiêu cuối cùng của tôi là để có thể vượt qua trong một biến chuỗi là tốt, cái gì đó như:

result = Model.objects.filter(text__iregex=r'\b'+stringVariable+r'\b') 

hoặc

result = Model.objects.filter(text__iregex=r'\b %s \b'%stringVariable) 

Nhưng ngay bây giờ tôi thậm chí không thể có được nó để làm việc với một chuỗi nguyên . Tôi đang sử dụng PostgreSQL.

+0

Bạn đang sử dụng cơ sở dữ liệu nào? – Matt

+0

@MattStevens, tôi đang sử dụng PostgreSQL. – GChorn

Trả lời

11

Sử dụng “\ y” thay vì “\ b” khi bạn đang sử dụng PostgreSQL, điều này là do Django qua biểu hiện thường xuyên của bạn thẳng xuống PostgreSQL - vì vậy của RegEx của bạn cần phải tương thích với nó. Bạn sẽ có thể thực hiện chúng từ psql mà không có bất kỳ vấn đề.

result = Model.objects.filter(text__iregex=r"\y{0}\y".format(stringVariable)) 

Xem: http://bit.ly/ZtpojU

+1

Chính xác là gì '\ y'? –

+0

Django không thực hiện bất kỳ việc dịch các PCRE nào thành các biểu thức chính quy của PostgreSQL (xem: http://bit.ly/ZtpbgH). Vì vậy, bạn chỉ cần sử dụng các biểu thức chính quy của PostgreSQL, xem tại đây: http://bit.ly/ZtpojU – Matt

+0

Tác phẩm này. Cảm ơn bạn đã thêm giải thích về '\ y'. Đối với phần ''{0}' định dạng (stringVariable)', đó chỉ là một cách khác để viết ''% s'% stringVariable'? Cả hai dường như làm việc cho tôi. – GChorn

1

Bạn có thể có thể để có được một cái gì đó bằng cách thả các regex và sử dụng một vài tra cứu django

result = Model.objects.filter(Q(text__contains=' someword ') | 
           Q(text__contains=' someword.') | 
           Q(text__istartswith = 'someword.' | 
           Q(text__istartswith = 'someword.' | 
           Q(text__iendswith = 'someword') 

thấy here cho tài liệu.

Tôi nhận ra điều đó không quá thanh lịch (nhưng giúp bảo trì dễ dàng nếu bạn không phải là người hâm mộ regex).

+1

Bởi vì điều này không thực hiện một kết hợp toàn bộ từ; ví dụ: nếu tôi thực hiện 'text__contains = 'tart'', tôi sẽ nhận các kết quả như' bắt đầu'. – GChorn

+0

xấu của tôi - Tôi rõ ràng là không quen thuộc với sql đủ để biết rằng 'toàn bộ từ phù hợp' có nghĩa là một cái gì đó cụ thể. Dù sao, tôi đã cập nhật câu trả lời của tôi để cải thiện nó một chút. –

+0

Bảo trì dễ dàng? Có rất nhiều trường hợp bạn không bao gồm ở đó (giữa '()', dấu phẩy, v.v.). –

0

tôi đã cùng một vấn đề cố gắng để phù hợp với ranh giới từ bằng cách sử dụng Perl-tương thích chuỗi \ b. Cơ sở dữ liệu phụ trợ của tôi là MySQL.

Tôi đã giải quyết vấn đề bằng biểu thức lớp ký tự [[: không gian:]], ví dụ:

 q_sum = Q() 
     search_list = self.form.cleaned_data['search_all'].split(' '); 
     for search_item in search_list: 
      search_regex = r"[[:space:]]%s[[:space:]]" % search_item 
      q_sum |= Q(message__iregex=search_regex) 
     queryset = BlogMessages.objects.filter(q_sum).distinct() 
+0

Điều này sẽ không tính đến dấu chấm câu để bạn biết. – yekta

Các vấn đề liên quan