2016-06-22 53 views
1

我正在挖掘Twitter搜索API以獲取某個hashtag的推文,並使用Django 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) 

我得到重複,做Twitter的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

這似乎是我在找的東西。我的第一個想法是一個例外,但我不知道什麼例外。謝謝。 –

相關問題