2016-06-22 24 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

这似乎是我在找的东西。我的第一个想法是一个例外,但我不知道什么例外。谢谢。 –

相关问题