如何建立一个Django模型来存储Twitter对话?

时间:2020-05-04 08:07:24

标签: django python-3.x twitter tweepy

我正在构建一个工具,该工具将获取用户时间轴推文及其响应,并且我需要找出如何将这些对话存储在数据库中,以便随后将其呈现在模板中。

要进行对话,我使用一个while循环,该循环获取一条tweet的“ in_reply_to_status_id”,然后通过id检索此回复的状态对象,找到其“ in_reply_to_status_id”等,直到检索到整个对话为止。

这是我使用的代码:

conversation = []

while True:

    response = api.get_status(id=tweet_id, tweet_mode='extended')._json

    if response['in_reply_to_status_id'] == None:
        break
    else:
        message_dict = {}
        message_dict['author'] = response['user']['screen_name']
        message_dict['text'] = response['full_text']
        message_dict['created_at'] = response['created_at']
        message_dict['author_profile_url'] = response['user']['profile_image_url']
        conversation.append(message_dict)
        tweet_id = response['in_reply_to_status_id']

if len(conversation) == 0:
    return None

return reversed(conversation)

在我的models.py中,我有一个Tweet模型,我需要了解如何制作一个模型,该模型存储上述脚本检索的整个对话/对话/线程。而且,以后应该可以将对话呈现为简单的聊天对话。

我的第一个想法是在我的Tweet模型中添加“回复”字段,并将对话存储为JSON,但这对我来说似乎不是正确的解决方案。

1 个答案:

答案 0 :(得分:0)

我不知道您要获取或要存储的所有字段,但是对于我在您的代码中看到的内容,它应该可以工作(将max_length设置为应做的事情,我不知道):

Tweet(models.Model):
    author = models.Charfield(max_length=50)
    text = models.Charfield(max_length=500)
    author_profile_url = models.URLField(null=True, blank=True)
    reply_to = models.ForeignKey(Tweet, on_delete=models.CASCADE, related_name='replies')
    creation_date = models.DateTimeField()

要打印所有对话,您将需要遍历FK以查找所有相关对象,并在creation_date之前对它们进行排序。

如果您只想显示一个对话,则应通过视图发送对话的初始对象,然后可以执行以下操作:

{{ tweet.author }}
{{ tweet.text }}
{{ tweet.creation_date }}
{% if tweet.reply_to_set.count > 0 %}
    {% with replies=tweet.reply_to_set.all %}
        {% for reply in replies %}
            {{ reply.author }}
            {{ reply.text }}
            {{ reply.creation_date }}
            replies to this message: {{ reply.reply_to_set.count }}
        {% endfor %}
    {% endwith %}
{% endif %}

这将首先显示推文信息,然后检查是否有回复以及是否向您显示每个推文的信息。在该回复中,我添加了replies to this message,您可以在其中让其他人知道该回复是否还有其他回复。万一您想做无限回复系统(例如twitter)。但是然后您可以在该模板中添加一个链接,该对象的回复就是该模板,因此它将成为主要推文,然后将显示回复。