Evgenii Legotckoi
Evgenii LegotckoiНаурыз 26, 2017, 1:45 Т.Ж.

Django - Оқулық 021. Модельдік мұра, абстрактілі модель

Мазмұны

Сайтта рефакторингтен кейін төрт негізгі нысан анықталды, оларда ортақ қасиеттер анықталды, атап айтқанда:

  • Мақалалар - Мақалалар
  • Пікір - Түсініктемелер
  • ForumTopic - Форум тақырыптары (мысалы, сұрақтар)
  • ForumPost - форум тақырыптарына жауаптар

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

Мұнда бір маңызды мәселе бар: Дерексіз деп жарияланған модель дерекқорда кесте жасамайды.

Абстрактілі үлгі жасау үшін Meta. класы үшін абстракт айнымалы мәнін True мәніне орнату керек.


PostBase

PostBase - бұл базалық дерексіз модель болады. Бұл дерексіз деректер үлгісінде жоғарыда аталған үлгілерге ортақ төрт өріс анықталды:

  • автор – мақаланың, түсініктеменің, тақырыптың немесе жауаптың авторы;
  • мазмұн – мазмұн;
  • pub_date – жарияланған күні;
  • модерация - модерация, барлық мазмұнда төрт мүмкін нұсқа болуы мүмкін:
  • СПАМ - түсініктемелер жоқ;
  • NOT_MODERATED - расталмаған жазба, бұл жағдайда осы мәртебеге ие пайдаланушылардың мақалалары модерацияға дейін басқа пайдаланушыларға қолжетімді болмайды;
  • POST_MODERATED - жарияланғаннан кейін модерация, пайдаланушының мақаласы жарияланғаннан кейін басқа пайдаланушыларға қолжетімді болады, бірақ ол әлі модерациядан өткен жоқ;
  • MODERATED - хабарлама модерацияланды.

Бұл дерексіз модельдің мәлімдемесі келесідей болады:

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

from django.db import models
from django.contrib.auth.models import User
from django.utils.translation import ugettext_lazy as _

from ckeditor_uploader.fields import RichTextUploadingField

class PostBase(models.Model):
    class Meta:
        abstract = True    # данное поле указывает, что класс абстрактный
                           # и что для него не нужно создавать таблицу

    SPAM = 'S'
    NOT_MODERATED = 'N'
    POST_MODERATED = 'P'
    MODERATED = 'M'
    MODERATION_CHOICES = (
        (SPAM, 'SPAM'),
        (NOT_MODERATED, 'Not Moderated'),
        (POST_MODERATED, 'Post Moderated'),
        (MODERATED, 'Moderated')
    )

    author = models.ForeignKey(User, verbose_name=_("Автор"))
    content = models.TextField(_('Содержание'), blank=True)
    pub_date = models.DateTimeField(_('Дата публикации'), blank=True, null=True)
    moderation = models.CharField(
        _('Модерация'),
        max_length=1,
        choices=MODERATION_CHOICES,
        default=NOT_MODERATED
    )

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

Үлгінің құрылымы, мысалы, пікірлер үшін енді келесідей болуы мүмкін:

class Comment(PostBase):
    class Meta:
        db_table = "comments"

    article = models.ForeignKey(Article)

автор , pub_date , мазмұн және модерация өрістерін енді көрсету қажет емес, өйткені олар PostBase сыныбында бар. Ең бастысы, үлгідегі PostBase. үлгісіндегідей атаулары бар өрістерді енгізбеңіз.

PostBaseAdmin

Сондай-ақ, сөзсіз артықшылығы - сіз барлық сыныптарға ортақ бір басқару тақтасының параметрін жасай аласыз.

Мысалы, өрістерді көрсетуді, мазмұнды іздеуді және сүзуді орнатуды және модерация күйін орнату мүмкіндігін (яғни, сәйкес әрекеттерді қосу) жасайық.

class PostBaseAdmin(admin.ModelAdmin):
    list_display = ('content', 'author', 'pub_date')
    search_fields = ('content', 'author__username')
    list_filter = ('moderation',)
    actions = ['make_spam', 'make_not_moderated', 'make_post_moderated', 'make_moderated']

    def moderate(self, request, rows_updated, choice_description):
        if rows_updated == 1:
            message_bit = "1 запись помечена, как %s" % choice_description
        else:
            message_bit = "%s записей отмечены, как %s." % (rows_updated, choice_description)
        self.message_user(request, "%s" % message_bit)

    def make_spam(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.SPAM),
            choice_description="SPAM"
        )
    make_spam.short_description = "Отметить помеченные, как SPAM"

    def make_not_moderated(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.NOT_MODERATED),
            choice_description="NOT_MODERATED"
        )
    make_not_moderated.short_description = "Отметить помеченные, как NOT_MODERATED"

    def make_post_moderated(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.POST_MODERATED),
            choice_description="POST_MODERATED"
        )
    make_post_moderated.short_description = "Отметить помеченные, как POST_MODERATED"

    def make_moderated(self, request, queryset):
        self.moderate(
            request=request,
            rows_updated=queryset.update(moderation=PostBase.MODERATED),
            choice_description="MODERATED"
        )
    make_moderated.short_description = "Отметить помеченные, как MODERATED"

Сүзу тізімдерін кеңейту немесе кейбір үлгілер үшін әрекеттерді қосқыңыз келсе, PostBaseAdmin ішінен келесідей мұраға алуға болады:

class ArticleAdmin(PostBaseAdmin):
    # Либо полностью переопределить отображаемые поля или поля для поиска
    list_display = ('title', 'section', 'author', 'pub_date', 'views', 'moderation')
    search_fields = ('title', 'author__username', 'section__title')
    # Либо добавить к существующему списку дополнительные
    list_filter = PostBaseAdmin.list_filter + ('status', 'section')
    # В случае actions подобное объявление просто добавит новые actions к существующим
    actions = ['publish', 'unpublish']

Django үшін Timeweb хостының VDS-сервері ұсынамын.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

Пікірлер

Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
Кіріңіз немесе Тіркеліңіз
Г

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

  • Нәтиже:66ұпай,
  • Бағалау ұпайлары-1
t

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

  • Нәтиже:33ұпай,
  • Бағалау ұпайлары-10
t

Qt - Тест 001. Сигналы и слоты

  • Нәтиже:52ұпай,
  • Бағалау ұпайлары-4
Соңғы пікірлер
G
GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
d
dblas5Шілде 5, 2024, 11:02 Т.Ж.
QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
k
kmssrАқп. 8, 2024, 6:43 Т.Қ.
Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
Енді форумда талқылаңыз
Evgenii Legotckoi
Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
F
FynjyШілде 22, 2024, 4:15 Т.Ж.
при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
BlinCT
BlinCTМаусым 25, 2024, 1 Т.Ж.
Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
BlinCT
BlinCTМамыр 5, 2024, 5:46 Т.Ж.
Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
Evgenii Legotckoi
Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

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