Study/django

django orm deep dive 2 - Django 5 ORM Model Essentials 2024

bluebamus 2024. 3. 7.

https://www.youtube.com/watch?v=davrrlaKEOI&list=PLOLrQ9Pn6cazL1rwTY2d66M9VppexGL-_&index=24

 

 - 46강의 중 필요한 내용만 정리한다.

 

 1. Defining custom primary keys

   - 직접 primary key를 설정 하는 방법

   - 설정을 하지 않으면 자동으로 id가 생성된다. 하지만 직접 정의할 수 도 있다. 

   - Autofield를 사용하면 해당 필드는 자동증가가 된다.

class SeasonalEvents(models.Model)
	id = models.BigAutoField(primary_key=True)

 

 2. Using Editable

   - field의 속성중에  editable이 있다. 

      - form에서 해당 필드를 제외시킨다. 입력 또는 편집이 불가능하다.

         - 장고 관리자 폼에서 readonly_fields 옵션을 사용하면 읽기 전용으로 표시할 수 있다.

      - serializer에서 해당 필드를 기본적으로 읽기 전용(read_only)으로 설정한다. 

         - 필요시 serializer에서 명시적으로 필드를 다시 변경 가능하다.

slug = models.SlugField(editable=False)

 

 3. Automatically populate certain fields based on other fields

   - admin에서 사용되는 prepopulated_fields는 타겟 필드의 입력에 따라 정해진 필드의 정보가 자동으로 입력되게 만들어주는 필드이다.

      - 예) name 필드에 정보가 입력되면 slug 필드에 자동으로 동일 내용이 입력된다.

class CategoryAdmin(admin.ModelAdmin):
	prepopulated_fields = {"slug": ("name",)}

 

   - model의 save()를 이용해 slug의 자동 입력을 만들 수 있다.

def save(self, *args, **kwargs):
	if not self.slug:
    	self.slug = slugify(self.name)
    super().save(*args, **kwargs)

 

 4. admin inline 정리

   - inline을 상속받은 class에서 사용되는 변수

      - extra : 보여질 폼의 수 기본적으로 3개의 빈 폼을 제공한다.

      - fk_name : 모델이 ForeignKey로 연결된 부모 모델을 참조하는 데 사용되는 필드를 명시하는 데 사용된다.

class ChildCategoryInline(admin.TabularInline):
	model = Category
    fk_name = "parent"
    extra = 1

 

   - modeladmin을 상속받은 class에서 사용되는 변수 

      - list_display에 커스텀 필드를 정의할 수 있다.

     

class ParentCategoryAdmin(admin.ModelAdmin):
	inline = [ChildCategoryInline]
    list_display = (
    	"name",
        "parent_name",
    )
    
    def parent_name(self, obj):
    	return obj.parent.name if object else None

 

 5. 다중 중첩에 대한 admin 구현

   - admin에서 inlinemodeladmin이 있지만, 이는 한 단계의 nested 구조만을 지원한다. 다중 구조는 지원을 하지 않는다.

   - 이 경우 사용 가능한 것이 django-nested-admin이다.

      - https://github.com/theatlantic/django-nested-admin

   - 주요 기능 및 호환성 :

      - 중첩 인라인: 복수의 모델 간 관계가 중첩 구조인 경우, 이를 한 번의 인터페이스에서 관리할 수 있도록 도와준다.

      - 드래그 앤 드롭 정렬: 사용자 친화적인 인터페이스를 통해 중첩된 인라인의 순서를 쉽게 바꿀 수 있다.

 

   - 설치 방법 :

pip install django-nested-admin

 

   - 사용 방법 :

# settings.py 
INSTALLED_APPS = [
	...
    "nested_admin",
}

# admin.py
import nested_admin

class ProductImageInline(nested_admin.NestedStackedInline):
	model = ProductImage
   	extra = 1
    
class ProductLineInline(nested_admin.NestedStackedInline):
	model = ProductLine
    	inline = [ProductImageInline]
    	extra = 1
        
class ProductAdmin(nested_admin.NestedModelAdmin):
	inline = [ProductLineInline]
   	 ...

 

 - rerefence : 

https://gonna-be.tistory.com/6

 

[Django / DRF] Nested 구조의 모델 다루기

장고를 하다보면 nested 구조의 모델들을 다루게 될 때가 많다. 특히, 이번에 음식점 리뷰와 관련한 백엔드 API를 작성하는 프로젝트 진행하였는데, 굉장히 깊은 nested 구조를 다루게 되었다. 따라

gonna-be.tistory.com

https://github.com/theatlantic/django-nested-admin

 

GitHub - theatlantic/django-nested-admin: Django admin classes that allow for nested inlines

Django admin classes that allow for nested inlines - theatlantic/django-nested-admin

github.com

https://github.com/seonkyuKim/manage_web_docker_compose

 

GitHub - seonkyuKim/manage_web_docker_compose

Contribute to seonkyuKim/manage_web_docker_compose development by creating an account on GitHub.

github.com

 

 

 

 

댓글