2015-01-22 1 views
1

Django에서 queryset 및 regex를 사용하여 중복을 찾을 수 있습니까?Django가 queryset 및 regex와 중복을 찾는다

Django select only rows with duplicate field values 는 정규식을 사용하지 않고 보여줍니다

class company(models.Model): 
    Website = models.URLField(blank=True, null=True) 

내가 예를 들어

정규식

와 중복을 찾으려면 :

self.values('Website').annotate(count=Count('id')).order_by().filter(count__gt=1) 

내가 모델이있다.

Company.objects.create(Website='http://example.com') 
Company.objects.create(Website='http://www.example.com') 

둘 다 동일한 웹 사이트입니다. 나는 그것이 중복으로 이러한 회사를 반환합니다 있도록 정규식을 사용하고 싶습니다.

정규식을 사용하는 필터가 있다는 것을 알고 있습니다. 내가 정규식을 사용하려면이를 업데이트하는 방법을 잘 모르겠어요 :

self.values('Website').annotate(count=Count('id')).order_by().filter(count__gt=1) 

나는 같은 것을 할 싶습니다

Website__iregex='http[s]?://(?:[a-zA-Z]|[0-9]|[[email protected]&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+' 

업데이트를 내가주지 않도록 약간의 혼동이 있었다 보기.

  1. http://example.org (이름에서 = A)와 이름에서 http://example.org (= 여기

    내 DB 내가 뭔가를 반환

    Company.objects.all().values('Website').annotate(count=Count('id')).order_by().filter(count__gt=1) 
    

    를 호출 할 때

    Company.objects.create(Website='http://example.com') 
    Company.objects.create(Website='http://www.example.com') 
    Company.objects.create(Website='http://example.org', Name='a') 
    Company.objects.create(Website='http://example.org', Name='b') 
    

    모습입니다 b)

example.com과 www.example.com은 동일한 웹 사이트입니다.

example.com과 www.example.com이 동일한 웹 사이트라는 것을 장고에게 알릴 수 있도록 정규 표현식을 사용하고 싶습니다. 그래서

Company.objects.all().values('Website').annotate(count=Count('id')).order_by().filter(count__gt=1) 

는 중복 반환 :

  1. http://example.orghttp://example.org (이름에서 = B)

  2. (이름 = A에서)를

    나는 수정할 example.com www.example.COM

+0

이 .annotate (count = Count ('id')). order_by(). filter (count__gt = 1)'전혀 작동하지 않습니까? –

답변

1

사용 __icontains는 :

Company.objects.filter(Website__icontains='example.com') 

생산합니다 어느 :

http://example.com, http://www.example.com 
+0

중복 된 것을 찾는 방법을 찾고 있습니다. 필자는 예제에서 장고가 "example.com"과 "www.example.com"이 동일한 웹 사이트라는 것을 인식 할 수있는 방법을 원한다. – brian

+1

위의 쿼리 세트를 사용하면 –

+0

중복 웹 사이트를 찾는 쿼리 세트를 실행하고 싶습니다. 귀하의 코드는 중복 된 URL을 알고 있다고 가정합니다. 또한 오타라고 가정하는 객체를 만듭니다. 이 표현식을 수정하여 www와 non-www가 같은 웹 사이트임을 깨닫고 싶습니다 : values ​​('Website') annotate (count = Count ('id')) order_by(). filter (count__gt = 1) – brian

0

: 회사 테이블에 존재하는 경우

`ILIKE %'example.com'%. 

그것은 따라서 다음과 같은 레코드를 반환합니다 나야. 일부 프로젝트에서 유사한 DB 구조 - 일부 엔티티의 URL을 저장합니다. 중복을 찾기 위해 나는 또한 URL의 '도메인'을 저장합니다.

그래서 당신의 예에 관한 DB 구조는 다음과 같습니다

id |   url   | domain 
----------------------------------------- 
1 | http://www.example.com | example.com 
2 | http://example.com  | example.com 

그것은 중복을 찾거나 URL을/특정 도메인에 관련된 실체를 찾기 위해 다음 쉽다.

이러한 접근 방식을 사용하면 중복을 감지하는 것이 과잉이라고 생각할 수 있습니다.

하지만 당신의 접근 방식이 큰 단점이 있습니다

1)이

매칭 "www.example.com"과 "example.com"도메인에게 변화를 일치 정확한 정규 표현식을 작성하는 것은 불가능 쉽습니다. 어때요 "example.co.uk"과 "www.example.co.uk"또는 어쩌면 "www.старт.рф"와 "старт.рф"? 그것들은 모두 유효한 도메인 이름입니다.

2) 계속 성장하는 DB 테이블에 장기간 쓰는 복잡한 정규 표현식에서 다리를 쏠 수 있습니다. 은 성능을 떨어 뜨립니다.

p.s. - "tldextract"lib를 사용하여 URL 도메인을 가져옵니다.