Jadual Kandungan
Penubuhan model
SQLite 的启动
创建超级管理员
模型 API 测试
总结
Rumah pembangunan bahagian belakang Tutorial Python Penubuhan dan operasi model Python Django (contoh terperinci)

Penubuhan dan operasi model Python Django (contoh terperinci)

Nov 09, 2022 pm 03:04 PM
python

Artikel ini membawa anda pengetahuan yang berkaitan tentang Python, yang terutamanya memperkenalkan kandungan yang berkaitan tentang penubuhan dan operasi model Django. Mari kita lihat bersama-sama.

Penubuhan dan operasi model Python Django (contoh terperinci)

[Cadangan berkaitan: Tutorial video Python3]

Penubuhan model

Kami akan membina blog system , mula-mula gunakan arahan python manage.py startapp blog untuk mencipta aplikasi blog baharu dalam direktori di mana manage.py terletak, dan kemudian tulis kelas dalam ./blog/models.py dan namakannya BlogArticles.

Melalui kelas ini kita boleh mencipta jadual pangkalan data yang khusus digunakan untuk menyimpan catatan blog adalah seperti berikut:

from django.db import modelsfrom django.utils import timezone   # 新增from django.contrib.auth.models import User    # 新增# Create your models here.# 编写博客的数据类型类BlogArticlesclass BlogArticles(models.Model):    # 字段title的属性为CharField()类型,并且以参数max_length=300说明字段的最大数量
    title = models.CharField(max_length=300)    # 一个用户对应多篇文章,级联删除
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts")
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)    class Meta:
        ordering = ("-publish", )   # 规定了BlogArticles实例对象的显示顺序,即按照publish字段值的倒序显示

    def __str__(self):        return self.title
Salin selepas log masuk

Saya percaya selepas pengenalan dalam artikel sebelumnya, anda akan. mengenali ramai muka di sini. Kami sudah biasa dengan mereka, dan sekarang kami akan memperkenalkan mereka secara ringkas:

  • modul zon waktu Kami akan merekodkan masa penerbitan artikel pada masa hadapan, jadi kami mengimport modul ini. Tetapi kerana Django menghidupkan zon waktu secara lalai dan ialah UTC, anda perlu membuat tetapan berikut dalam tetapan:
TIME_ZONE = 'Asia/Shanghai'     # 设置东八区时间# TIME_ZONE = 'UTC'USE_TZ = False
Salin selepas log masuk
  • User Model dinamakan terbina dalam pengesahan aplikasi, yang dinamakan sempena ruang nama django.contrib.auth muncul dalam konfigurasi INSTALL_APPS
  • ForeignKey(), mencerminkan bahawa pengguna boleh menerbitkan berbilang artikel, dengan parameter on_delete=models.CASCADE ialah "pemadaman lata" dalam pangkalan data. Jika "jadual pengguna "Jika pengguna dalam "Jadual Artikel" dipadamkan, rekod artikel yang sepadan dengan pengguna dalam "Jadual Artikel" juga akan dipadamkan.
  • Parameter lain related_name="blog_posts" digunakan untuk membenarkan tika Pengguna (nama pengguna tertentu) membuat pertanyaan terbalik pada kejadian kelas BlogArticles menggunakan atribut "blog_posts".
  • Kami juga mentakrifkan subkelas Meta dan menggunakan ordering = ("-publish", ) untuk menentukan susunan paparan artikel Kaedah
  • __str__ ialah perwakilan rentetan objek. Kita boleh menggunakan nama bahagian untuk mewakilinya.

Dalam langkah di atas, kami masih hanya menulis model catatan blog dalam aplikasi blog yang kami buat Jika kami mahu aplikasi itu berkuat kuasa, kami juga perlu mengkonfigurasi aplikasi ke dalam tetapan kami 🎜 > Tambahkan aplikasi blog pada senarai settings.py fail, seperti yang ditunjukkan di bawah: INSTALLED_APPS

Penubuhan dan operasi model Python Django (contoh terperinci)

Model data kelas ditulis, dan kami mendapat jadual pangkalan data melalui kelas ini Setiap medan dan atribut dicipta. BlogArticles

Migrasi Data

Langkah seterusnya ialah memberitahu Django bahawa kelas model saya telah dibuat dan sudah tiba masanya untuk anda mencipta pangkalan data Mari buka terminal dan pergi ke folder di mana

fail terletak. Kemudian jalankan arahan: manage.py

python manage.py makemigrations
Salin selepas log masuk
Kemudian anda akan melihat output berikut:

Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model BlogArticles
Salin selepas log masuk
Pada masa ini, Django mencipta fail bernama

dalam /blog/migrations fail direktori. Ia mewakili keadaan semasa model aplikasi, dan dalam langkah seterusnya, fail ini akan digunakan untuk membuat jadual dan lajur. 0001_initial.py

Fail migrasi akan diterjemahkan ke dalam pernyataan SQL. Jalankan arahan berikut:

 python manage.py sqlmigrate blog 0001
Salin selepas log masuk
Kemudian anda boleh melihat output berikut:

BEGIN;
--
-- Create model BlogArticles
--
CREATE TABLE "blog_blogarticles" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(300) NOT NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id") DEFERRABLE INITIALLY DEFERRED);
CREATE INDEX "blog_blogarticles_author_id_ed798e23" ON "blog_blogarticles" ("author_id");
COMMIT;
Salin selepas log masuk
Akhir sekali, kami menggunakan fail migrasi yang dihasilkan ke pangkalan data:

 python manage.py migrate
Salin selepas log masuk
Apabila anda melihat

Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
...
Applying sessions.001_initial... OK
Salin selepas log masuk

, ini ialah skrip migrasi yang kami hasilkan pada langkah sebelumnya. Ini bermakna pangkalan data kami sedia untuk digunakan. Applying sessions.001_initial... OK

Django disertakan dengan pangkalan data SQLite Perlu diingat bahawa SQLite ialah pangkalan data peringkat produk. SQLite digunakan oleh banyak syarikat dalam beribu-ribu produk, seperti semua peranti Android dan iOS, penyemak imbas web utama, Windows 10, MacOS dan banyak lagi. Tetapi ini tidak sesuai untuk setiap keadaan. SQLite tidak boleh dibandingkan dengan pangkalan data seperti MySQL, PostgreSQL atau Oracle. Tapak web volum tinggi, aplikasi intensif tulis, set data besar dan aplikasi konkurensi tinggi menggunakan SQLite akhirnya akan menyebabkan masalah.

SQLite sangat ringan, tetapi ia tidak menjejaskan penggunaan kami untuk pembelajaran Seterusnya, kami akan menggunakan alat baris arahan untuk mengendalikan model, iaitu, kami telah mempelajari operasi asas pangkalan data - menambah, memadam, mengubah suai, semak.

Operasi Model

Dalam kandungan di atas, model artikel blog diwujudkan, dan kemudian kami mencipta jadual pangkalan data kami yang sepadan melalui pemindahan data, dan kemudian melakukan beberapa operasi penambahan, pemadaman dan pengubahsuaian berdasarkan model di atas, bahagian kecil kandungan ini mungkin memerlukan semua orang untuk mengetahui sedikit operasi pangkalan data. Saya percaya bahawa semua orang membaca set nota pengenalan ini dengan tujuan untuk mempelajari Django Saya tidak berani melakukan apa-apa di hadapan taikun pangkalan data, jadi saya akan pergi terus ke bab ini.

SQLite 的启动

对数据库的操作可以利用 GUI 工具,也可以通过命令行 sqlite3  db.sqlite3,我们在 db.sqlite3 所在的目录下使用上述命令,就可以进入到 db.sqlite3 数据库,如果本地开发中没有配置 SQLite 环境,可以自行搜索如何配置。

如果我们输入命令,看到如下信息,说明进入成功:

 ~/DjangoProject/myblog $ sqlite3 db.sqlite3
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite>
Salin selepas log masuk

然后我们使用 .tables 即可查看当前数据库中的数据库表的名称,除了 blog_blogarticles 是我们通过 BlogArticles 模型建立的,其余的都是项目默认创建的数据库表。

 ~/DjangoProject/myblog $ sqlite3 db.sqlite3
SQLite version 3.29.0 2019-07-10 17:32:03
Enter ".help" for usage hints.
sqlite> .tables
auth_group                  blog_blogarticles         
auth_group_permissions      django_admin_log          
auth_permission             django_content_type       
auth_user                   django_migrations         
auth_user_groups            django_session            
auth_user_user_permissions
sqlite>
Salin selepas log masuk

接下来使用 pragma table_info(blog_blogarticles); 命令来查看 blog_blogarticles 表的结构:

sqlite> .header on
sqlite> pragma table_info(blog_blogarticles);
cid|name     |type        |notnull|dflt_value|pk
  0|  id     |integer     |1      |          |1
  1|title    |varchar(300)|1      |          |0
  2|body     |text        |1      |          |0
  3|publish  |datetime    |1      |          |0
  4|author_id|integer     |1      |          |0
sqlite>
Salin selepas log masuk

.header on 开启头部显示

SQLite 的 PRAGMA 命令是一个特殊的命令,可以用在 SQLite 环境内控制各种环境变量和状态标志。一个 PRAGMA 值可以被读取,也可以根据需求进行设置。

我们可以大致查看上面的表结构,cid 是指列 id,name 是指列名,type 是指列类型,notnull 非空,值为 1 表示 True,dflt_value 是指 default 默认值(这一列没有值,说明设置设置默认值),pk 是指 primary_key 主键。

大家可以跟我们在前一章中的数据模型 BlogArticles 所规定的字段和属性进行对比,是不是刚好我们利用数据迁移成功将数据模型转化为数据库表。

创建超级管理员

我们可以在命令行中输入 python manage.py createsuperuser 创建一个 Django 超级管理员,输入用户名和密码,当提示 Superuser created successfully,创建成功。如下:

 ~/DjangoProject/myblog $ python manage.py createsuperuser 
Username (leave blank to use 'yuzhou_1su'): zoeu
Email address: test@test.com
Password: 
Password (again): 
Superuser created successfully.
Salin selepas log masuk

然后我在浏览器输入 http://127.0.0.1:8000/admin/ ,就可以打开如下界面:

Penubuhan dan operasi model Python Django (contoh terperinci)

输入刚才创建的超级管理员的用户名和密码就可以进入系统,如图:

Penubuhan dan operasi model Python Django (contoh terperinci)

Groups 和 Users 是 Django 在用户管理应用中默认的用户分类。为了让我们得管理员用户能够发布博客,我们需要在 ./blog/admin.py 文件中,加入如下代码:

from django.contrib import admin# 新增,将BlogArticles类引入到当前环境中from .models import BlogArticles    

# 将BlogArticles注册到admin中admin.site.register(BlogArticles)
Salin selepas log masuk

刷新页面,我们可以得到如下的页面:

Penubuhan dan operasi model Python Django (contoh terperinci)

超级管理员界面先放在这,我们回到模型操作。

模型 API 测试

使用 Python 进行开发的一个重要优点是交互式 shell。我们在 ./blog/models.py 中创建了数据模型后,Django 就会自动提供数据库抽象的 API,这是一种快速尝试和试验 API 的方法。通过这个 API 我们可以快速创建、获取、修改和删除对象,对此我们称之为 ORM(Object-Relational Mapper)

我们可以使用 manage.py 工具加载我们的项目来启动 Python shell :

python3 manage.py shell
Salin selepas log masuk
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
Salin selepas log masuk

请特别注意我们进入 shell 的方式,不是直接在命令行中敲 python3,虽然这与直接输入 python 指令来调用交互式控制台是非常相似。

区别是我们利用 manage.py 工具,将项目将被添加到 sys.path 并加载 Django。这意味着我们可以在项目中导入我们的模型和其他资源并使用它。

让我们从导入 BlogArticles 类开始:下面就可以开始我们对数据库的增、删、改、查等操作。

$ python3 manage.py shell  
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) 
[Clang 6.0 (clang-600.0.57)] on darwinType "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)>>> from django.contrib.auth.models import User>>> from blog.models import BlogArticles>>> admin = User.objects.get(username="zoue")>>> admin.username'zoeu'>>> admin.id1>>> admin.password'pbkdf2_sha256$150000$b9j0ZKBVZSo1$l+fEIiKIaS6u1mhjMPOX1qR0xMOaemnRJIwiE2lNn60='>>> admin.email'test@test.com'>>> type(admin)
<class></class>
Salin selepas log masuk

以上是对用户的查询操作是不是刚好是我们上一节中在创建管理员的内容,恭喜你!

接下来,我们对博客文章进行操作,要创建新的 BlogArticle 对象,我们可以执行以下操作:

>>> BlogAriticle01 = BlogArticles(title ='DjangoNotes_Day01', author=zoue, body='Django是啥?');
Salin selepas log masuk

为了将这个对象保存在数据库中,我们必须调用 save 方法:

>>> BlogAriticle01.save()
Salin selepas log masuk

save方法用于创建和更新对象。这里Django创建了一个新对象,因为这时 BlogAriticle01 实例没有 id。第一次保存后,Django 会自动设置 ID :

>>> BlogAriticle01.id4
Salin selepas log masuk

因为我自己在之前创建过其它文章,所以这个 id 值为 4,如果你是按照本入门笔记一步步操作过来,id 值应该为 1。

当然,还可以查看其它属性,这里统一将命令敲出来:

>>> BlogAriticle01.title'DjangoNotes_Day01'>>> BlogAriticle01.author
<user:>>>> BlogAriticle01.body'Django是啥?'>>> BlogAriticle01.publish
datetime.datetime(2019, 9, 30, 19, 56, 58, 735676)>>></user:>
Salin selepas log masuk

每个 Django 模型都带有一个特殊的属性; 我们称之为模型管理器(Model Manager)。你可以通过属性 objects 来访问这个管理器,它主要用于数据库操作。例如,我们可以使用它来直接创建一个新的 Board 对象:

>>> BlogArticle02 = BlogArticles.objects.create(title='Python', author=admin, body='Head First to Python.')>>> BlogArticle02.id5
Salin selepas log masuk

要更新一个值,我们可以利用如下操作:

>>> BlogAriticle01.body = 'I love Django, 但是我太难了'>>> BlogAriticle01.body'I love Django, 但是我太难了'
Salin selepas log masuk
>>> blogs = BlogArticles.objects.all()>>> blogs
<queryset>, <blogarticles:>, <blogarticles:>, <blogarticles:>, <blogarticles:>]></blogarticles:></blogarticles:></blogarticles:></blogarticles:></queryset>
Salin selepas log masuk

结果是一个 QuerySet,我们可以将这个 QuerySet 看作一个列表。假设我们想遍历它并打印每个模块的标题。

>>> for blog in blogs:...     print(blog.title)... Python
DjangoNotes_Day01
right here waiting
Yesterday once more
You Raise me up>>>
Salin selepas log masuk

同样,我们可以使用模型的 管理器(Manager) 来查询数据库并返回单个对象。为此,我们要使用 get 方法:

>>> BlogArticles.objects.get(id=5)
<blogarticles:></blogarticles:>
Salin selepas log masuk
>>> BlogArticles.objects.get(id=5).delete() 
(1, {'blog.BlogArticles': 1})
Salin selepas log masuk

删除后再重新查看一下 QuerySet,发现没有了,说明删除成功。

>>> blogs = BlogArticles.objects.all()>>> blogs
<queryset>, <blogarticles:>, <blogarticles:>, <blogarticles:>]></blogarticles:></blogarticles:></blogarticles:></queryset>
Salin selepas log masuk

除了 get 方法,其实也可以用 filter 进行筛选查询 id=5 然后删除,BlogArticles.objects.filter(id=5).delete(),关于 filter 方法我们将在后面的文章中进行介绍。

总结

下面是我们在本节中关于模型学到的方法和操作,使用 BlogArticles 模型作为参考。大写的 BlogArticles 指的是类,BlogArticles01BlogArticles 的一个实例(或对象):

操作 代码示例
创建一个对象而不保存 BlogAriticle01 = BlogArticles()
保存一个对象(创建或更新) BlogAriticle01.save()
数据库中创建并保存一个对象 BlogArticle02 = BlogArticles.objects.create(title='...', author=..., body='...')
列出所有对象 BlogArticles.objects.all()
通过字段标识获取单个对象 BlogArticles.objects.get(id=5)
通过字段标识删除单个对象 BlogArticles.objects.get(id=5).delete()

【相关推荐:Python3视频教程

Atas ialah kandungan terperinci Penubuhan dan operasi model Python Django (contoh terperinci). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

PHP dan Python: Contoh dan perbandingan kod PHP dan Python: Contoh dan perbandingan kod Apr 15, 2025 am 12:07 AM

PHP dan Python mempunyai kelebihan dan kekurangan mereka sendiri, dan pilihannya bergantung kepada keperluan projek dan keutamaan peribadi. 1.PHP sesuai untuk pembangunan pesat dan penyelenggaraan aplikasi web berskala besar. 2. Python menguasai bidang sains data dan pembelajaran mesin.

Python vs JavaScript: Komuniti, Perpustakaan, dan Sumber Python vs JavaScript: Komuniti, Perpustakaan, dan Sumber Apr 15, 2025 am 12:16 AM

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Penjelasan terperinci mengenai Prinsip Docker Penjelasan terperinci mengenai Prinsip Docker Apr 14, 2025 pm 11:57 PM

Docker menggunakan ciri -ciri kernel Linux untuk menyediakan persekitaran berjalan yang cekap dan terpencil. Prinsip kerjanya adalah seperti berikut: 1. Cermin digunakan sebagai templat baca sahaja, yang mengandungi semua yang anda perlukan untuk menjalankan aplikasi; 2. Sistem Fail Kesatuan (Unionfs) menyusun pelbagai sistem fail, hanya menyimpan perbezaan, menjimatkan ruang dan mempercepatkan; 3. Daemon menguruskan cermin dan bekas, dan pelanggan menggunakannya untuk interaksi; 4. Ruang nama dan cgroups melaksanakan pengasingan kontena dan batasan sumber; 5. Pelbagai mod rangkaian menyokong interkoneksi kontena. Hanya dengan memahami konsep -konsep teras ini, anda boleh menggunakan Docker dengan lebih baik.

Cara menjalankan program di terminal vscode Cara menjalankan program di terminal vscode Apr 15, 2025 pm 06:42 PM

Dalam kod VS, anda boleh menjalankan program di terminal melalui langkah -langkah berikut: Sediakan kod dan buka terminal bersepadu untuk memastikan bahawa direktori kod selaras dengan direktori kerja terminal. Pilih arahan Run mengikut bahasa pengaturcaraan (seperti python python your_file_name.py) untuk memeriksa sama ada ia berjalan dengan jayanya dan menyelesaikan kesilapan. Gunakan debugger untuk meningkatkan kecekapan debug.

Bolehkah kod studio visual digunakan dalam python Bolehkah kod studio visual digunakan dalam python Apr 15, 2025 pm 08:18 PM

Kod VS boleh digunakan untuk menulis Python dan menyediakan banyak ciri yang menjadikannya alat yang ideal untuk membangunkan aplikasi python. Ia membolehkan pengguna untuk: memasang sambungan python untuk mendapatkan fungsi seperti penyempurnaan kod, penonjolan sintaks, dan debugging. Gunakan debugger untuk mengesan kod langkah demi langkah, cari dan selesaikan kesilapan. Mengintegrasikan Git untuk Kawalan Versi. Gunakan alat pemformatan kod untuk mengekalkan konsistensi kod. Gunakan alat linting untuk melihat masalah yang berpotensi lebih awal.

Python: Automasi, skrip, dan pengurusan tugas Python: Automasi, skrip, dan pengurusan tugas Apr 16, 2025 am 12:14 AM

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.

Boleh kod vs dijalankan di Windows 8 Boleh kod vs dijalankan di Windows 8 Apr 15, 2025 pm 07:24 PM

Kod VS boleh dijalankan pada Windows 8, tetapi pengalaman mungkin tidak hebat. Mula -mula pastikan sistem telah dikemas kini ke patch terkini, kemudian muat turun pakej pemasangan kod VS yang sepadan dengan seni bina sistem dan pasangnya seperti yang diminta. Selepas pemasangan, sedar bahawa beberapa sambungan mungkin tidak sesuai dengan Windows 8 dan perlu mencari sambungan alternatif atau menggunakan sistem Windows yang lebih baru dalam mesin maya. Pasang sambungan yang diperlukan untuk memeriksa sama ada ia berfungsi dengan betul. Walaupun kod VS boleh dilaksanakan pada Windows 8, disyorkan untuk menaik taraf ke sistem Windows yang lebih baru untuk pengalaman dan keselamatan pembangunan yang lebih baik.

Adakah sambungan vscode berniat jahat? Adakah sambungan vscode berniat jahat? Apr 15, 2025 pm 07:57 PM

Sambungan kod VS menimbulkan risiko yang berniat jahat, seperti menyembunyikan kod jahat, mengeksploitasi kelemahan, dan melancap sebagai sambungan yang sah. Kaedah untuk mengenal pasti sambungan yang berniat jahat termasuk: memeriksa penerbit, membaca komen, memeriksa kod, dan memasang dengan berhati -hati. Langkah -langkah keselamatan juga termasuk: kesedaran keselamatan, tabiat yang baik, kemas kini tetap dan perisian antivirus.

See all articles