2015-12-09 2 views
0

У меня есть модель PageДжанго поиск Страницы с завершающим слэшем и без

class Page(models.Model): 
    category = models.ForeignKey(Category) 
    title = models.CharField(max_length=128) 
    url = models.URLField() 
    views = models.IntegerField(default=0) 

При добавлении новой страницы через форму Я хочу, чтобы убедиться, что я не добавляю уже добавила страницы.

Так что я это сделать, как этот

******* 
if Page.objects.filter(url=link) 
******* 

Но есть проблема. Иногда экземпляр страницы имеет URL-адрес с завершающим косой чертой, а иногда и нет. Такая же ситуация с данной ссылкой.

Ситуации

link = http://newsru.com 
url = http://newsru.com/ 

я мог бы использовать здесь url__startswith, но он обнаружит все страницы с newsru.com/page1, newsru.com/page2 и так далее.

url_contains не поможет

я мог бы использовать что-то вроде этого

if Page.objects.filter(url=link.strip('/') 

Но URL может быть с косой чертой в конце.

Что такое правильный поиск этой ситуации?

+0

Почему вы не проверяете URL-адреса на пути, так что все они последовательны? –

+0

Вы хотите проверить URL-адрес в 'save()' method или какой-нибудь валидатор? – GriMel

+0

В методе проверки; предположительно, они вводятся через какую-то форму, вы должны написать метод 'clean_url()', чтобы гарантировать, что значение всегда заканчивается косой чертой. –

ответ

1

В Django вы можете использовать Q() объектов для поиска или поиска.

from django.db.models import Q 
link = link.strip('/') 
Page.objects.filter(Q(url=link)|Q(url=link+'/') 

Как Даниэль предлагает в комментариях, лучший подход был бы нормализовать URLs, как они складываются, так что они либо все имеют слеш или ни один из них.

+0

Что делать, если у меня есть ссылка на файл? Это не должно нормализоваться, не так ли? Однако ваш подход с Q, по-видимому, является наиболее приемлемым в этом подходе. – GriMel

+0

Обычно статические файлы, такие как pdf, обрабатываются отдельно и обслуживаются с разных URL-адресов. Если нет, вам придется пересмотреть свою нормализацию. Возможно, говоря, что все URL-адреса имеют завершающую косую черту, если они не содержат точку, будут работать. – Alasdair