我正在构建一个工具,该工具将获取用户时间轴推文及其响应,并且我需要找出如何将这些对话存储在数据库中,以便随后将其呈现在模板中。
要进行对话,我使用一个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,但这对我来说似乎不是正确的解决方案。
答案 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)。但是然后您可以在该模板中添加一个链接,该对象的回复就是该模板,因此它将成为主要推文,然后将显示回复。