Evgenii Legotckoi
Evgenii LegotckoiҚаз. 25, 2018, 2:47 Т.Ж.

Django - Оқулық 039. Сайтқа жеке хабарламалар мен чаттар қосу - 2 бөлім (оқылмаған хабарламалармен сөйлесулер мен чаттарды санау)

Сайтта жеке хабарламаларды түзетуге бос уақыт болды. Бұл функционалдылық өте жиі қолданылмайды, сондықтан мен оны жақсартуға көп күш жұмсамаймын, бірақ бұл функцияны тиісті жұмысқа жеткізу уақыты келді.

Бұрын оқылмаған хабарламалары бар диалогтық терезелердің есептегіші көрсетілмеуінен тұратын өте үлкен кемшілік болды, бұл хабарлама жіберілген пайдаланушының оған назар аудармауына әкелді, өйткені олар бұл хабарламалар туралы білмеді.

Енді мен бұл кемшілікті түпкілікті түзеткенмін. Және алдыңғы код ішінде қандай түзетулер қосылғанын көрсетемін.


Мен оқылмаған хабарламалардың есептегіштерін ұйымдастырудың екі нұсқасы туралы ойладым. Керісінше, бір опция және оның жетілдірілген нұсқасы.

  • Әрбір сұрау бойынша барлық чаттарды тексеріңіз, олардан соңғы хабарларды таңдаңыз және автор осы хабарды тексергіңіз келетін авторизацияланған пайдаланушы екенін тексеріңіз. Егер ол автор болмаса, онда бұл хабарламаның оқылған-оқылмағанын тексереміз, егер оқылмаған болса, бұл пайдаланушының диалогтық терезесі оқылмаған болып саналады. Мұндай диалогтардың саны оқылмаған диалогтар саны ретінде қарастырылады.
  • Ал мен шешкен екінші нұсқа бірдей логиканы болжайды, тек диалогта немесе чатта оған қосылған соңғы хабарламаның сыртқы кілті болуы керек. Бұл кілт әрбір жаңа хабармен жаңартылады. Бұл чат хабарларын алу және ең соңғы хабарды алу үшін оларды сұрыптау қажеттілігін жояды. Бұл, менің ойымша, диалогтар көп болса, дерекқор үшін үлкен шығындарға әкелуі мүмкін.

Іске асыру

models.py

Соңғы хабарға сыртқы кілтті, сондай-ақ ChatManager теңшелетін чат менеджерін қосамыз.

# -*- coding: utf-8 -*-

#... Код из предыдущей части


class ChatManager(models.Manager):
    use_for_related_fields = True

    # Метод принимает пользователя, для которого должна производиться выборка
    # Если пользователь не добавлен, то будет возвращены все диалоги,
    # в которых хотя бы одно сообщение не прочитано
    def unreaded(self, user=None):
        qs = self.get_queryset().exclude(last_message__isnull=True).filter(last_message__is_readed=False)
        return qs.exclude(last_message__author=user) if user else qs


class Chat(models.Model):
    #... Код из предыдущей части

    # внешний ключ на последнее сообщение,
    # важный момент в том, что название класса Message пишем обычной строкой,
    # поскольку на момент чтения класса Chat интерпретатор Python ничего не знает о классе Message
    # Также необходимо добавить related_name, имя через которое будет ассоциироваться выборка данного сообщения из базы данных
    last_message = models.ForeignKey('Message', related_name='last_message', null=True, blank=True, on_delete=models.SET_NULL)

    objects = ChatManager()

    @models.permalink
    def get_absolute_url(self):
        return 'users:messages', (), {'chat_id': self.pk }


class Message(models.Model):
    #... Код из предыдущей части

receivers.py

Мен мұндай Python файлында Django жобасында бірінші рет жазып отырмын. Оның мәні сол жерде модельден сигнал өңдеушілері жарияланады. Джангода модель нысанын сақтау кезінде өңдеуге болатын кейбір сигналдар шығарылады. Бұл бөлек файлға кейбір дәйекті логиканы қоюға және жоба кодының қалған бөлігін біршама таза етуге мүмкіндік береді. Кемшілігі - бұл код анық болмауы мүмкін, өйткені жобаның басқа бөліктерінде бұл кодқа сілтемелер болмайды.

# -*- coding: utf-8 -*-

from django.db.models.signals import post_save
from django.dispatch import receiver

from users.models import Message


# обработчик сохранения объекта сообщения
@receiver(post_save, sender=Message)
def post_save_comment(sender, instance, created, **kwargs):
    # если объект был создан
    if created:
        # указываем чату, в котором находится данное сообщение, что это последнее сообщение
        instance.chat.last_message = instance
        # и обновляем данный внешний ключ чата
        instance.chat.save(update_fields=['last_message'])

Бірақ дәл солай, бұл код жұмыс істемейді, өйткені бұл файлды аудармашыға жүктеу керек.

Қолданба инициализацияланған кезде мұны apps.py файлында орындауға болады

apps.py

Бұл дайын әдіспен жасалады.

# -*- coding: utf-8 -*-

from django.apps import AppConfig
from django.utils.translation import ugettext_lazy as _


class UsersConfig(AppConfig):
    name = 'users'
    verbose_name = _('Users')

    def ready(self):
        import users.receivers

Қолдану

Енді оқылмаған хабарламалары бар диалогтар санын алу үшін қажет нәрсенің бәрі бар болғандықтан, бұл ақпаратты үлгіні көрсету контекстіне қосуға болады.

context['unreaded_dialogs_counter'] = user.chat_set.unreaded(user=user).count()

Ескі диалогтарды қалай түзетуге болады

Хабарламалары бар ескі диалогтарды түзету ғана қалады. Тиісті әрекетті қоссаңыз, мұны басқару тақтасы арқылы жасауға болады.

admin.py

# -*- coding: utf-8 -*-

from django.contrib import admin

from users import models


class ChatAdmin(admin.ModelAdmin):
    autocomplete_fields = ['members']
    search_fields = ('members',)
    actions = ['fix_last_messages']

    def fix_last_messages(self, request, queryset):
        for chat in queryset.all():
            chat.last_message = chat.message_set.all().order_by('-pub_date').first()
            chat.save(update_fields=['last_message'])

    fix_last_messages.short_description = "Fix last messages"


class MessageAdmin(admin.ModelAdmin):
    autocomplete_fields = ['chat', 'author']
    list_display = ('chat', 'author', 'message', 'pub_date', 'is_readed')


admin.site.register(models.Chat, ChatAdmin)
admin.site.register(models.Message, MessageAdmin)
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Ол саған ұнайды ма? Әлеуметтік желілерде бөлісіңіз!

Anton
  • Там. 4, 2020, 2:19 Т.Ж.
  • (өңделген)

Здравствуйте, подскажите как именно должна выглядеть уже готовая вьюха с context? Не догоняю как его вставить

Anton
  • Там. 4, 2020, 2:25 Т.Ж.

Может быть посоветуете как добавить необязательное поле + прокинуть его во вьюху что бы можно было отправлять небольшие документы.?

Anton
  • Там. 5, 2020, 4:20 Т.Ж.

Этот вопрос я решил)

Evgenii Legotckoi
  • Там. 5, 2020, 5:14 Т.Ж.

Добавляйте поле файла в модель сообщения. И в форме сообщения указывайте, что поле с файлом.

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
OI
  • Ora Iro
  • Жел. 24, 2024, 6:38 Т.Ж.

C++ - Тест 001. Первая программа и типы данных

  • Нәтиже:40ұпай,
  • Бағалау ұпайлары-8
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:50ұпай,
  • Бағалау ұпайлары-4
m
  • molni99
  • Қаз. 26, 2024, 1:37 Т.Ж.

C++ - Тест 004. Указатели, Массивы и Циклы

  • Нәтиже:80ұпай,
  • Бағалау ұпайлары4
Соңғы пікірлер
ИМ
Игорь МаксимовҚар. 22, 2024, 11:51 Т.Ж.
Django - Оқулық 017. Теңшелген Django кіру беті Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii LegotckoiҚаз. 31, 2024, 2:37 Т.Қ.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZEҚаз. 19, 2024, 8:19 Т.Ж.
Qt Creator көмегімен fb3 файл оқу құралы Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь МаксимовҚаз. 5, 2024, 7:51 Т.Ж.
Django - Сабақ 064. Python Markdown кеңейтімін қалай жазуға болады Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey1Қар. 15, 2024, 6:04 Т.Ж.
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProjectМаусым 4, 2022, 3:49 Т.Ж.
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9AnonimҚаз. 25, 2024, 9:10 Т.Ж.
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

Бізді әлеуметтік желілерде бақылаңыз