避免在没有任何django唯一约束错误的情况下在django中重复模型实例

时间:2017-01-11 18:55:26

标签: django

我写了一个新闻聚合器服务,我每5分钟运行一次定期任务,根据投票获取热门故事并将数据保存到数据库。 一切正常,但我遇到了问题。 在每5分钟,可能有也可能没有新条目,我的服务将重复条目保存到DB。 如果我使用unique=True那么我的芹菜工作者会显示有关django唯一约束违规和崩溃的错误。

有没有办法避免重复数据而不会出错。

我知道也许这不是最好的做法,但我有这个用例。 请在django中建议如何做到这一点。

model.py

class Article(models.Model):
    username = models.CharField(max_length=20)
    title  = models.CharField(max_length=200)
    url = models.URLField(max_length=100)
    upvotes = models.PositiveIntegerField()
    description = models.TextField(max_length=500,null=True)
    sentiment = models.CharField(max_length=20)

    class Meta:
        verbose_name = "Article"
        verbose_name_plural = "Articles"
        unique_together =  (("title", "url"),)

tasks.py

@periodic_task(
    run_every=(crontab(minute='*/5')),
    name="add",
    ignore_result=False
)
def add():
    response = requests.get(TOP_STORIES, headers=headers)
    for i in response.json()[:10]:
        response_id = requests.get(
            "some_url".format(id=str(i)),
            headers=headers)
        item = response_id.json()
        params = {
            "txt": item.get("title")
        }
        response_senti = requests.post(
            "https://community-sentiment.p.mashape.com/text/", headers=headers_sent, data=params
        )

        senti = response_senti.json().get("result")

        Article.objects.create(username=item.get("by"),
                               title=item.get("title"),
                               url=item.get("url"),
                               upvotes=item.get("score"),
                               sentiment=senti.get("sentiment")
                               )

0 个答案:

没有答案