2016-06-22 3 views
1

특정 해시 태그의 트윗을 트위터 검색 API에서 마이닝하여 장고 ORM을 사용하여 Postgresql 데이터베이스에 저장합니다.Django 데이터베이스에서 중복 객체를 제거하는 가장 좋은 방법은 무엇입니까

다음은이 루틴을 처리하는 내 tasks.py 파일의 코드입니다.

"""Get some tweets and store them to the database using Djano's ORM.""" 

import tweepy 
from celery import shared_task 

auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) 
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) 

api = tweepy.API(auth, wait_on_rate_limit=True) 


@shared_task(name='get_tweets') 
"""Get some tweets from the twiter api and store them to the db.""" 
def get_tweets(): 
    tweets = api.search(
     q='#python', 
     since='2016-06-14', 
     until='2016-06-21', 
     count=5 
    ) 
    tweets_date = [tweet.created_at for tweet in tweets] 
    tweets_id = [tweet.id for tweet in tweets] 
    tweets_text = [tweet.text for tweet in tweets] 

    for i, j, k in zip(tweets_date, tweets_id, tweets_text): 
     update = Tweet(
      tweet_date=i, 
      tweet_id=j, 
      tweet_text=k 
     ) 
     update.save() 

은 여기 내 models.py

from django.db import models 


class Tweet(models.Model): 
    tweet_date = models.DateTimeField() 
    tweet_id = models.CharField(max_length=50, unique=True) 
    tweet_text = models.TextField() 

    def __str__(self): 
     return str(self.tweet_date) + ' | ' + str(self.tweet_id) 

나는 점점 오전 중복, 트위터 API로 할 수 있습니다.

개체가 데이터베이스에 저장되기 전에 중복을 확인하는 방법이 있습니까? 여기 :

for i, j, k in zip(tweets_date, tweets_id, tweets_text): 
     update = Tweet(
      tweet_date=i, 
      tweet_id=j, 
      tweet_text=k 
     ) 
     update.save() 

여기서 추출 과정에서 내가 돌볼 수있는이 뭔가가 아니면 내가 변환 단계에서와 같이, 이후 정리해야 뭔가?

+1

어떤 필드 당신이 말할 때 다스 려하는'duplicate'하는 일을 할 수 있습니까? –

+0

'tweet_id'는 유일해야합니다.이 모델에서는 모델에 고유하게 설정되어 있지만, Celery가 새로운 객체를 생성하여 데이터베이스에 저장하려고하면 키 오류가 발생하여 중단됩니다. –

답변

1

당신은 당신의 모델 매니저는

from django.db import IntegrityError 

for i, j, k in zip(tweets_date, tweets_id, tweets_text): 
    try: 
     Tweet.objects.create(
      tweet_date=i, 
      tweet_id=j, 
      tweet_text=k 
     ) 
    except IntegrityError: 
     log('duplicate tweet id {}'.format(j) 
     pass 
+0

그게 내가 찾는 것 같다. 내 첫 번째 생각은 예외 였지만 어떤 예외인지 몰랐다. 감사. –

관련 문제