Skip to main content

A CLI tool to generate Django project skeletons.

Project description

dgi-skeleton

License Python Version

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.py

    ubah atribut name contohnya seperti:

    class UserConfig(AppConfig):
       # ...
       name = 'apps.user' # sebelumnya name = 'user'
    
  • settings.py

    dalam variabel INSTALLED_APPS tambahkan apps.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:

  1. 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
    
  2. Daftarkan cron di variabel CRON_CLASSES pada file settings.py

    CRON_CLASSES = [
       'apps.namaappnya.cron.my_cron_job',
       # ...
    ]
    
  3. 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

  1. Buat django project
    dgi-skeleton startproject {namaproject}
    
  2. Masuk ke directory {namaproject} yang telah dibuat, kemudian install dependency:
    pip install -r requirements.txt
    
  3. Ubah config .env sesuai kebutuhan

Membuat App Baru

  1. Masuk ke directory apps
    cd apps
    
  2. 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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dgi_skeleton-0.1.2.tar.gz (13.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dgi_skeleton-0.1.2-py3-none-any.whl (19.9 kB view details)

Uploaded Python 3

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

Hashes for dgi_skeleton-0.1.2.tar.gz
Algorithm Hash digest
SHA256 1ad828737058609a4703b9a65ce2b4e19c8a562157fc49ef82d18e8f9c5d7104
MD5 b417aa27a9597b49fccca57ee3295096
BLAKE2b-256 5321207b089c2fb1ba17bd2b54540de0c4a907fa994e07e5e817b1d42bddd4ca

See more details on using hashes here.

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

Hashes for dgi_skeleton-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 db87d2b012b601ed8b7a9c259cc3b5b5a17eb5b4d51665464c9d88556806a227
MD5 e0008391b47b354c3fd9b2a1fba3a700
BLAKE2b-256 f92af5deaa1f955d1dad15de31abb19531467b2155e323845de8cde7ecd385b3

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page