首页 > 解决方案 > Django Webhook 创建双数据库条目

问题描述

我目前正在使用 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。似乎有些事情搞砸了,但我一点也不知道是什么。非常感谢您查看此内容!

标签: djangodjango-modelsdialogflow-es

解决方案


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


推荐阅读