Django
μ΄λ³΄ μΉ νλ‘κ·Έλλ¨Έ
Proxy Model
- λ€μ€ ν
μ΄λΈ μμ(Multi-table inheritance)μ μ¬μ©νλ©΄ λͺ¨λΈμ κ° μμ ν΄λμ€μ λν΄ μ λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ΄ λ§λ€μ΄μ§
- μμ ν΄λμ€λ λΆλͺ¨ ν΄λμ€μλ μλ μΆκ° λ°μ΄ν° νλλ₯Ό μ μ₯ν μ₯μκ° νμ νκΈ° λλ¬Έμ μΌλ°μ μΌλ‘ μνλ λμ
- νμ§λ§ λλ‘λ νμ΄μ¬ μμ€μ λμλ§μ λ³κ²½ νκ³ μΆμ κ²½μ°λ μμ
- κΈ°λ³Έ 맀λμ λ₯Ό λ³κ²½νκ±°λ λ©μλλ₯Ό μΆκ° νλ μ λ
- μλ₯Ό λ€μ΄ μ¬μ©μ(μ μ ) λͺ¨λΈμ λ§λ€μλλ° κ΄λ¦¬μμ μΌλ° μ μ μ νλμ΄ λ€λ₯Έ κ²½μ°μ κ΄λ¦¬μ λΆλ¦¬μΈ νλλ₯Ό νλ μ£Όκ³ κ·Έ κ°μ λ°λΌμ κΈ°λ₯μ μν ν μ μμ§λ§ ν΄λμ€κ° λ무 컀μ§λ―λ‘ ν¨μ¨μ μΌλ‘ κΈ°λ₯λ§ λΆλ¦¬ κ°λ₯ νκ² νλ κ²μ΄ Proxy Model
- ν
μ΄λΈ μμλ λ³νλ μμ§λ§ νμ΄μ¬μμ ν
μ΄λΈμ λ€λ£¨λ λͺ¨λΈ(κ΄λ¦¬μ, μ€νν, μΌλ°μ μ )μ μ¬λ¬κ° μ¬μ©νκ³ μΆμ κ²½μ°
- μλ λͺ¨λΈμ λν νλ‘μλ₯Ό λ§λλ©΄ νλ‘μ λͺ¨λΈμ μΈμ€ν΄μ€λ₯Ό μμ±, μμ , μ
λ°μ΄νΈλ₯Ό ν μ μμΌλ©° μλ λͺ¨λΈμ μ¬μ©νλκ² μ²λΌ λͺ¨λ λ°μ΄ν°κ° μ μ₯λ¨
- μ°¨μ΄μ μ μλ³Έμ λ³κ²½νμ§ μκ³ νλ‘μμ κΈ°λ³Έ λͺ¨λΈ μμ λλ κΈ°λ³Έ 맀λμ μ κ°μ κ²μ λ³κ²½ ν μ μλ€λ κ²
Meta Class
μ Proxy=True
λ₯Ό μ€μ νμ¬ μ¬μ© ν μ μμ
from django.db import models
__all__ = (
'User',
'Admin',
'Staff',
)
class User(models.Model):
name = models.CharField(max_length=50)
is_admin = models.BooleanField(default=False)
def __str__(self):
return self.name
class Admin(User):
class Meta:
proxy = True
def drop(self, user):
user.delete()
def __str__(self):
return f'{self.name} (κ΄λ¦¬μ)'
class Staff(User):
class Meta:
proxy = True
def block(self, user):
user.is_block = True
user.save()
def __str__(self):
return f'{self.name} (μ€νν)'
- μ΄λ κ² κΈ°λ₯λ³λ‘ λλμ΄ μ¬μ©νλ©΄ μ€μν κ°λ₯μ±μ λ§μ΄ μ€μΌμ μκ³ λ§€λμ λ₯Ό λ°λ‘ λμ΄ κ΄λ¦¬ κ°λ₯
from django.db.models.manager import Manager
class User(models.Model):
...
is_staff = models.BooleanField(default=False)
is_block = models.BooleanField(default=False)
...
class AdminManager(Manager):
def get_queryset(self):
return super().get_queryset().filter(is_admin=True)
class Admin(User):
objects = AdminManager()
...
class StaffManager(Manager):
def get_queryset(self):
return super().get_queryset().filter(is_staff=True)
class Staff(User):
objects = StaffManager()
...
- μ΄λ°μμΌλ‘ λ§λ€λ©΄
get_query_set
μ ν΅ν΄ 맀λμ μμ κΈ°λ³Έμ μΌλ‘ κ°μ Έμ€λ 쿼리μ
μ λ³κ²½ ν μ μμ
- κΈ°λ³Έμ μΌλ‘ μ 체 λ°μ΄ν°λ₯Ό κ°μ Έ μ€μ§λ§ νλ‘μ λͺ¨λΈμ κΈ°λ³Έ 맀λμ λ₯Ό μ¬μ μ νμ¬ νν°λ§μ ν κ²μ κΈ°λ³ΈμΌλ‘ κ°μ Έμ΄
- νλ‘μ λͺ¨λΈμμλ
Meta
μμ±μ ordering
κ°μκ²μ μ¬μ©ν μ μμΌλ©° 맀λμ λ₯Ό μ¬λ¬κ° κ°μ§κ³ μμ μλ μμ
User
κ°μ²΄μ 쿼리λ₯Ό ν΄μ Admin
μ΄λ Staff
κ°μ²΄λ₯Ό κΊΌλ΄λ κ²μ λΆκ°λ₯
- μ΄κ²μ κΈ°μ‘΄ λͺ¨λΈμ λ체νλ κ²μ΄ μλ λ€λ₯Έ ννλ‘ μ°κΈ° μν΄ μλ λ°©λ²
- κ²°κ΅ κ°μ ν
μ΄λΈμ μ°λ λ€λ₯Έ ν΄λμ€κ° λλ€λ κ²
- νλ‘μ λͺ¨λΈμ μ νν νλμ λΉ μΆμμ λͺ¨λΈ ν΄λμ€λ₯Ό μμ ν΄μΌν¨
- νλ‘μ λͺ¨λΈμ λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈμ ν μ¬μ΄μ μ°κ²°μ μ 곡νμ§ μμΌλ―λ‘ μ¬λ¬ λΉ μΆμμ λͺ¨λΈμ μμλ°μ μ μμ
- μ€μ λ‘ μ‘΄μ¬νλ ν
μ΄λΈμ λͺ¨λΈμ νλλ§ μμ λ°μ μ μμΌλ©° λ§μ½
Abstract base class
μ νλκ° μλ λ©μλλ§ μμ κ²½μ°μλ μμμ λ°μ μ μμ
- μ€μ λͺ¨λΈμ μμλ°μ νλ‘μ λͺ¨λΈμ΄ μ‘΄μ¬ ν κ²½μ° κ·Έ νλ‘μ λͺ¨λΈμ λ€μ μμ λ°λ ννλ‘λ κ°λ₯
- νλ‘μ λͺ¨λΈμ λͺ¨λΈ 맀λμ λ₯Ό μ§μ νμ§ μμΌλ©΄ λͺ¨λΈ λΆλͺ¨λ‘λΆν° 맀λμ λ₯Ό μμ λ°μ
- νλ‘μ λͺ¨λΈμμ 맀λμ λ₯Ό μ μ νλ©΄ λΆλͺ¨ ν΄λμ€μ μ μ λ 맀λμ λ κΌμ μ¬μ©ν μ μμ§λ§ κΈ°λ³Έκ°μ΄ λ¨
- λ§μ½ νλ‘μ λͺ¨λΈμ κΈ°λ³Έ 맀λμ§λ₯Ό λ°κΎΈμ§ μκ³ μ κ΄λ¦¬μλ₯Ό μΆκ° νλ €λ©΄ μ κ΄λ¦¬μλ₯Ό ν¬ν¨νλ κΈ°λ³Έ ν΄λμ€λ₯Ό μμ±νκ³ κΈ°λ³Έ ν΄λμ€ λ€μμ μμν¨
Tip! μΆκ° λ΄μ©
λμΌν λͺ¨λΈμ λν μ¬λ¬ ModelAdmins
- λμΌν λͺ¨λΈμ λν΄ λ μ΄μμ
ModelAdmin
μ μμ±νκ³ κ°κ° λ€λ₯Έ λ°©μμΌλ‘ μ¬μ©μ μ μνκ³ λ€λ₯Έ URLμ λ§ν¬νλ λ°©λ²
- Proxy Modelμ μ¬μ©νμ¬ κ° λͺ¨λΈμ΄ ν λ²λ§ λ±λ‘ λ μ μλ€λ μ¬μ€μ 극볡
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'pubdate','user')
class MyPost(Post):
class Meta:
proxy = True
class MyPostAdmin(PostAdmin):
def get_queryset(self, request):
return self.model.objects.filter(user = request.user)
admin.site.register(Post, PostAdmin)
admin.site.register(MyPost, MyPostAdmin)
Tip! μΆκ° μμ
def create_modeladmin(modeladmin, model, name = None):
class Meta:
proxy = True
app_label = model._meta.app_label
attrs = {'__module__': '', 'Meta': Meta}
newmodel = type(name, (model,), attrs)
admin.site.register(newmodel, modeladmin)
return modeladmin