A CLI tool to generate Django project skeletons.
Project description
dgi-skeleton
dgi-skeleton merupakan library untuk membuat template Django project yang telah distandarisasi
Struktur Project
root_directory
├── apps
│ ├── user
│ │ ├──── api
│ │ │ ├──── __init__.py
│ │ │ ├──── serializers.py
│ │ │ ├──── urls.py
│ │ │ └──── views.py
│ │ ├──── migrations
│ │ ├──── __init__.py
│ │ ├──── admin.py
│ │ ├──── apps.py
│ │ ├──── cron.py
│ │ ├──── models.py
│ │ ├──── tests.py
│ │ └──── views.py
│ ├── utils
│ │ ├──── __init.py__
│ │ ├──── models.py
│ │ └──── pagination.py
│ └── __init__.py
├── configs
│ ├── __init__.py
│ ├── asgi.py
│ ├── healthcheck.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── .env
├── .gitignore
├── Dockerfile
├── manage.py
└── requirements.txt
admin.py
models yang akan didaftarkan di django admin didefinisikan menggunakan decorator @admin.register(modelnya), contoh penggunaan:
from django.contrib import admin
from apps.user.models import User
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ('kolom1', 'kolom2', 'kolom3', 'kolom..n')
search_fields = ('kolom1', 'kolom2', 'kolom..n')
autocomplete_fields = ('kolom1', 'kolom2', 'kolom..n') # jika ada relasi ke tabel lain
models.py
semua class models harus diturunkan dari class BaseModel yang telah didefinisikan pada file apps/utils/models.py, contoh penggunaan:
from django.db import models
from apps.utils.models import BaseModel
class MyModel(BaseModel):
# kolom ...
pass
untuk model user yang digunakan sebagai akses login ke django admin atau ke api, dapat menggunakan model yang telah didefinisikan pada file apps/user/models.py
class User(AbstractUser):
pass
model tersebut menggunakan username sebagai default identifier, jika terdapat kebutuhan untuk mengubah menjadi email atau field lain, bisa dilakukan dengan menambahkan atribut USERNAME_FIELD, contohnya seperti:
class User(AbstractUser):
email = models.EmailField(unique=True) # atau field lain
USERNAME_FIELDS = 'email' # atau field lain
catatan:
khusus untuk email, diperlukan untuk mengubah atribut REQUIRED_FIELDS menjadi
class User(AbstractUser):
email = models.EmailField(unique=True)
USERNAME_FIELDS = 'email'
REQUIRED_FIELDS = ('first_name', 'last_name', 'username') # ... field lainnya selain email
dokumentasi: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project
apps.py
karena app django nya berada dalam directory apps, maka terdapat beberapa bagian yang harus diubah, di antaranya adalah:
-
/{nama_appnya}/apps.pyubah atribut
namecontohnya seperti:class UserConfig(AppConfig): # ... name = 'apps.user' # sebelumnya name = 'user'
-
settings.pydalam variabel
INSTALLED_APPStambahkanapps.user, contohnya seperti:INSTALLED_APPS = [ # .... 'apps.user', ]
cron.py
file ini digunakan jika terdapat kebutuhan untuk menggunakan cron. Cron yang digunakan adalah django-cron. Contoh penggunaannya:
-
Buat cron
from django_cron import CronJobBase, Schedule class MyCronJob(CronJobBase): RUN_EVERY_MINS = 120 # setiap 2 jam schedule = Schedule(run_every_mins=RUN_EVERY_MINS) code = 'apps.namaappnya.cron.my_cron_job' # kode unit cron def do(self): pass # script cronnya
-
Daftarkan cron di variabel
CRON_CLASSESpada filesettings.pyCRON_CLASSES = [ 'apps.namaappnya.cron.my_cron_job', # ... ]
-
Jalankan cron menggunakan
python manage.py runcrons
tests.py
usahakan untuk selalu membuat test code untuk mengetahui ketika terjadi perubahan, perubahan tersebut tidak menyebabkan error. Contoh test code sederhana anggaplah terdapat class Barista dengan method buat_kopi() dengan return value class Kopi
class Kopi:
pass
class Barista:
def buat_kopi():
# ...
return Kopi()
from django.test import TestCase
class BaristaTestCase(TestCase):
def test_buat_kopi(self):
barista = Barista()
result = barista.buat_kopi()
self.assertIsInstance(result, Kopi)
untuk menjalankan testnya dapat menggunakan perintah python manage.py test
api/serializers.py
file ini berisikan semua class serializer yang terdapat dalam app yang bersangkutan, terdapat banyak sekali jenis serializer yang dapat digunakan, untuk itu gunakanlah sesuai kebutuhan yang ada. Selain itu hindari query dalam method untuk serializer dengan argument many=True karena akan mempengaruhi performa query, contohnya
models.py
from django.db import models
from apps.utils.models import BaseModel
class Author(BaseModel):
name = models.CharField(max_length=100)
# ...
class Blog(BaseModel):
author = models.ForeingKey(Author, on_delete=models.CASCADE, related_name='blogs')
# ...
api/serializers.py
from rest_framework import serializers
from .models import Author, Blog
class ListAuthorSerializer(serializers.ModelSerializer):
jumlah_blog = serializers.SerializerMethodField()
def get_jumlah_blog(self, obj):
jumlah_blog = Blog.objects.filter(author=obj).count()
return jumlah_blog
class Meta:
model = Author
fields = ('id', 'name', 'jumlah_blog')
api/views.py
from .models import Author
from .serializers import ListAuthorSerializer
# ...
def get(self, request):
authors = Author.objects.all()
serializer = ListAuthorSerializer(authors, many=True)
return serializer.data
contoh di atas akan mengakibatan terjadinya N+1 query, jika terdapat 10 Author maka yang akan terjadi adalah 1 query untuk semua Author dan 10 query untuk masing-masing Author untuk menghitung jumlah Blog. Hal di atas dapat dihindari dengan menggunakan mendapatkan jumlah blog dari views.py kemudian akses value nya dari serializer. Contohnya
api/views.py
from django.db.models import Count
from .models import Author
from .serializers import ListAuthorSerializer
# ...
def get(self, request):
authors = Author.objects.annotate(jumlah_blog=Count('blogs'))
serializer = ListAuthorSerializer(authors, many=True)
return serializer.data
api/serializers.py
from rest_framework import serializers
from .models import Author, Blog
class ListAuthorSerializer(serializers.ModelSerializer):
jumlah_blog = serializers.IntegerField()
class Meta:
model = Author
fields = ('id', 'name', 'jumlah_blog')
api/views.py
Penggunaan
Instalasi
pip install dgi-skeleton
Inisiasi Project
- Buat django project
dgi-skeleton startproject {namaproject}
- Masuk ke directory
{namaproject}yang telah dibuat, kemudian install dependency:pip install -r requirements.txt
- Ubah config
.envsesuai kebutuhan
Membuat App Baru
- Masuk ke directory apps
cd apps
- Buat app baru
dgi-skeleton startapp {namaapp}
atau dari directory root sejajar dengan file manage.py jalankan
dgi-skeleton startapp {namaapp} --destination ./apps
License
This project is licensed under the MIT License. See the LICENSE file for details.
Referensi
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dgi_skeleton-0.1.2.tar.gz.
File metadata
- Download URL: dgi_skeleton-0.1.2.tar.gz
- Upload date:
- Size: 13.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.9.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1ad828737058609a4703b9a65ce2b4e19c8a562157fc49ef82d18e8f9c5d7104
|
|
| MD5 |
b417aa27a9597b49fccca57ee3295096
|
|
| BLAKE2b-256 |
5321207b089c2fb1ba17bd2b54540de0c4a907fa994e07e5e817b1d42bddd4ca
|
File details
Details for the file dgi_skeleton-0.1.2-py3-none-any.whl.
File metadata
- Download URL: dgi_skeleton-0.1.2-py3-none-any.whl
- Upload date:
- Size: 19.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.9.11
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db87d2b012b601ed8b7a9c259cc3b5b5a17eb5b4d51665464c9d88556806a227
|
|
| MD5 |
e0008391b47b354c3fd9b2a1fba3a700
|
|
| BLAKE2b-256 |
f92af5deaa1f955d1dad15de31abb19531467b2155e323845de8cde7ecd385b3
|