Django Webhook创建双数据库条目

时间:2019-12-09 19:05:48

标签: django django-models dialogflow

我目前正在使用Django为Google Dialogflow编写Webhook应用程序。 一切正常,我基本上完成了。 由于某种原因,我现在开始遇到各种随机出现的问题,其中最严重的情况如下: 每当Webhook执行用户帐户创建调用时,它都会创建一个双数据库条目,这会使程序崩溃(因为我的.get突然返回多个元素而不是单个用户)。

我正在使用以下简单模型:

# model to create user entries
class TestUser(models.Model):
    name = models.CharField(max_length=200)
    userID = models.CharField(max_length=12, blank=True)
    registrationDate = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name


# model to add watched movies to user
class Movie(models.Model):
    username = models.ForeignKey(TestUser, on_delete=models.CASCADE)
    title = models.CharField(max_length=200, blank=True)
    genreID = models.IntegerField (blank=True)

    def __str__(self):
        return self.title

    def list_genre_id(self):
        return self.genreID

发生问题时在我的webhook中执行的部分应该是以下内容:

    if action == "account_creation":
        selection = req.get("queryResult").get("parameters").get("account_selection")
        if selection == "True":
            q = TestUser(name=f"{username}", userID=idgen())
            q.save()
            userID = TestUser.objects.get(name=f"{username}").userID
            fullfillmenttext = {"fulfillment_text": "Alright, I created a new account for you! Would you like to add "
                                                    "some of your favorite movies to your account?",
                                "outputContexts": [
                                    {
                                        "name": f"projects/nextflix-d48b9/agent/sessions/{userID}/contexts/create_add_movies",
                                        "lifespanCount": 1,
                                        "parameters": {
                                            "data": "{}"
                                        }
                                    }]}

这是我正在使用的简单idgen函数:

def idgen():
    y = ''.join(
        random.SystemRandom().choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for _ in range(12))
    return y

我正在尝试创建此用户ID,以在所有用户的webhook调用中具有唯一的会话ID。似乎有些事情弄乱了,但我一点儿也不知道是什么。 非常感谢您的关注!

1 个答案:

答案 0 :(得分:1)

看来我能够解决此问题: 问题显然是我将先前outputContext的生命周期设置为2而不是1,这导致由于某种原因两次执行该代码单元的答案。伙计,dialogflow是如此糟糕的程序。