Как построить модель django для хранения разговоров в твиттере? - PullRequest
0 голосов
/ 04 мая 2020

Я создаю инструмент, который получает твиты пользователей и их ответы на временной шкале, и мне нужно выяснить, как хранить эти разговоры в базе данных, чтобы потом их отображать в шаблоне.

Чтобы получить разговор, я использую while l oop, который получает «in_reply_to_status_id» твита, затем получает идентификатор объекта статуса этого ответа по идентификатору, находит его «in_reply_to_status_id» et c пока весь разговор не будет восстановлен.

Это код, который я использую:

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 голосов
/ 04 мая 2020

Я не знаю всех полей, которые вы получаете или хотите сохранить, но для того, что я увидел в вашем коде, это должно сработать (установите 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, в котором вы можете сообщить людям, есть ли у этого ответа другие ответы. На всякий случай, если вы хотите сделать бесконечную систему ответов (как твиттер). Но тогда вы можете добавить ссылку на этот же шаблон, в котором объект является тем ответом, так что это будет основной твит, а затем будут показаны ответы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...