[TIL] Model Types형 Field와 속성에 대해 22/11/14 11일차

2022. 11. 16. 04:00스파르타코딩(22.8.29~22.12.31)/TIL(Today I Learned)

- Today I Learned

- 모델링을 하려다보니 각 field가 갖는 type을 지정하고 속성을 설정해야하는데

   해당부분이 부족하다고 생각되어 장고 문서를 참고해서 알아보려고 한다.

   부족한 부연설명은 추가

   개인적으로 자주 사용하는 부분은 하향식으로 정렬하고

   사용 빈도수가 낮은 것은 회색으로 표시하여

   필드에 대해 알아가며 이해해보고자한다.

 

- String Field (문자열 필드)

더보기

- CharField (255까지의 문자열)

클래스CharField ( max_length=None , **옵션 ) 

필수옵션 : max_length=255

작은 크기에서 큰 크기의 문자열에 대한 문자열 필드입니다 .

많은 양의 텍스트의 경우 를 사용 TextField하십시오.

이 필드의 기본 양식 위젯은 TextInput.

필드의 최대 길이(문자)입니다. max_length는 데이터베이스 수준과 Django의 유효성 검사에서 MaxLengthValidator.

- TextField

클래스 TextField ( ** 옵션 ) 

  • 큰 텍스트 필드. 이 필드의 기본 양식 위젯은 Textarea.
  • 속성 을 지정하면 자동 생성된 양식 필드의 위젯에 max_length반영됩니다 .
  • 최대 65535 byte. utf8 기준(3바이트 문자)으로 21844 글자 (max_length 21844)
  • Textarea그러나 모델 또는 데이터베이스 수준에서는 적용되지 않습니다.(DB에서 length가 반영안되는것 같다.)
  • 그것을 위해 사용하십시오 CharField.TextField.db_collation
  • 선택 과목. 필드의 데이터베이스 데이터 정렬 이름입니다.
  • *데이터 정렬 이름은 표준화되지 않았습니다. 따라서 이것은 여러 데이터베이스 백엔드 간에 이식할 수 없습니다.

- EmailField(이메일)

  • 클래스 EmailField ( max_length = 254 , ** 옵션 ) ¶
  • CharField와 같지만 EmailValidator로 검사한다. 기본으로 max_length=254이다.

- Numeric Field(숫자열 필드)

더보기

- IntegerField

   클래스 IntegerField ( ** 옵션 ) 

  •    허용 범위 : -2147483648 ~ 2147483647 정수 값을 저장.

- DecimalField (소수점을 포함한 정수)

  class DecimalField ( max_digits = 없음 , decimal_places = 없음 , ** 옵션 ) 
  • Decimal파이썬에서 인스턴스 로 표현되는 고정 정밀도 10진수 . 를 사용하여 입력의 유효성을 검사합니다 DecimalValidator.
  • 다음과 같은 필수 인수가 있습니다. *Decimal = 소수
  • DecimalField.max_digits
  • 숫자에 허용되는 최대 자릿수입니다. 이 숫자는 decimal_places 보다 크거나 같아야 합니다 (0을 말하는듯)
  • DecimalField.decimal_places
  • 숫자와 함께 저장할 소수 자릿수입니다.
  • 예를 들어, 999.99소수점 이하 2자리의 해상도로 최대 숫자를 저장하려면 다음을 사용합니다.
  • models.DecimalField(..., max_digits=5, decimal_places=2)
    
  • 소수점 이하 10자리의 해상도로 최대 약 10억까지 숫자를 저장하려면 다음을 수행합니다.
models.DecimalField(..., max_digits=19, decimal_places=10)

 

- PositiveBigIntegerField(큰 범위의 양수값)

   클래스 PositiveBigIntegerField ( ** 옵션 ) 

  • 0 to 9223372036854775807(100경)
  • a PositiveIntegerField와 비슷하지만 특정(데이터베이스 종속) 지점 해당 값만 허용합니다.

 

- FloatField

  클래스 FloatField ( ** 옵션 ) 

  • 부동 소수점의 실수를 저장한다. python의 float instance를 사용한다. 고정 소수점과 부동소수점 차이는 CS 기초 중 하나이다. 컴퓨터는 2진수를 사용하고, 그에 따라서 소수점 표현이 굉장히 난해하다. 아직 잘 모른다면 꼭 짚고 넘어가자. 파이썬 공식문서도 도움이 된다.
  • 계산식에서 유동적인 연산이 필요한 부분에 float을 사용한다.
  • 그래서 자연스럽게 model에서 decimal을 사용하는 경우가 많다고 한다. *decimal소수점을 포함한 정수
  • 지수 형태로 표현되어서 아주 아주 큰 숫자 또는 아주 아주 작은 숫자를 표현 할때 장점이 많다. (과학적 계산 등이 아닌 이상, 일상 생활에서 이 정도 범위 큰 숫자를 사용하는 경우는 많지 않을 것 같다.)
  • FloatField는 내부적으로 Python의 Float 유형을 사용하는 반면,
  • DimalField는 Python의 Decimal 유형을 사용한다.

 

- BigIntegerField (소수점을 포함한 큰 숫자의범위)

  클래스BigIntegerField ( **옵션 )

  • 64 비트 정수 IntegerField입니다 -9223372036854775808 to 9223372036854775807의 범위의 값을 저장.(64 비트 정수)
  • 이 필드의 기본 양식 위젯은 NumberInput.
  • AutoField와 같지만 숫자 범위가 64bit이다.
  • *BigAutoField와 같지만 값을 양수만 보장하지 않고, 음수인 경우까지 포함한다.

- BigAutoField

  클래스BigAutoField ( **옵션 )

  • 1 to 9223372036854775807 까지 1씩 자동 증가

- SmallIntegerField(작은범위의 정수값)¶

  • IntegerField비슷하지만 특정(데이터베이스 종속) 지점 아래의 값만 허용합니다.
  • -32768 to 32767 정수값(2 Bytes)까지 저장

- PositiveIntegerField(중간 범위의 양수값)

      클래스 PositiveIntegerField ( ** 옵션 ) 
  •  0 to 2147483647
  •  IntegerField비슷하지만 양수이거나 0( 0)이어야 합니다.

- PositiveSmallIntegerField(작은 범위의 양수값)

      클래스 PositiveSmallIntegerField ( ** 옵션 ) 
  • 0 to 32767
  • a PositiveIntegerField와 비슷하지만 특정(데이터베이스 종속) 지점 해당 값만 허용합니다.

- AutoField (2진수의 범위 10진법으로 표현하면 1 to 32767)

     클래스AutoField ( **옵션 )

  • IntegerField사용 가능한 ID에 따라 자동으로 증가 하는입니다.
  • 일반적으로 이것을 직접 사용할 필요는 없습니다.
  • 달리 지정하지 않으면 기본 키 필드가 모델에 자동으로 추가됩니다. 자동 기본 키 필드 를 참조하십시오 .
  • 다만, primary_key가 명시되어있는 컬럼이 있을경우 추가하지 않는다.
  • 자동추가되는 id필드는 auto_increment integer field이다.
  • auto increment 되는 IntegerField이다. 명시하지 않으면 아래와 같은 코드가 자동으로 생성된다.
id = models.AutoField(primary_key=True)

- SmallAutoField

클래스SmallAutoField (**옵션 ) 

  • 1 to 32767

-Auto Field IntegerField사용 가능한 ID에 따라 1씩 자동 증가


- Date & Time field (날짜&시간 필드)

더보기

  • auto_now=True :Model.save로 저장할 때마다 현재 시간으로 갱신된다. updated_at 필드에 주로 사용한다.(QuerySet.update로는 갱신되지 않는다). 
  • auto_now_add = True : 처음객체가 생성될 때 현재 시간으로 설정된다created_at 필드에 사용한다.
  • 개체가 저장될 때마다 자동으로 필드를 지금으로 설정합니다. "최종 수정" 타임스탬프에 유용합니다. 현재 날짜가 항상 사용됩니다. 재정의할 수 있는 기본값이 아닙니다.

- TimeField(시간)

class TimeField ( auto_now = False , auto_now_add = False , ** options ) 

파이썬에서 datetime.time인스턴스로 표현되는 시간. 와 동일한 자동 채우기 옵션을 허용합니다 DateField.

이 필드의 기본 양식 위젯은 TimeInput. 관리자는 일부 JavaScript 바로 가기를 추가합니다.

- DateField (날짜)

 class DateField ( auto_now=False , auto_now_add=False , **options ) 

- DateTimeField (날짜와 시간)

  • DataField와 유사하시지만 시간을 같이 저장한다.
  • class DateTimeField ( auto_now = False , auto_now_add = False , ** options ) ¶datetime.datetime파이썬에서 인스턴스 로 표현되는 날짜와 시간 . 와 동일한 추가 인수를 사용 DateField합니다.
  • 이 필드의 기본 양식 위젯은 단일 DateTimeInput입니다. 관리자는 TextInputJavaScript 바로 가기가 있는 두 개의 개별 위젯을 사용합니다.
  • Python에서 datetime.date인스턴스로 표시되는 날짜입니다. 몇 가지 추가 선택적 인수가 있습니다.
  • DateField.auto_now
  • 이 필드는 를 호출할 때만 자동으로 업데이트됩니다 Model.save(). 와 같은 다른 방식으로 다른 필드를 업데이트할 때 필드는 업데이트되지 않지만 QuerySet.update()업데이트에서 필드에 대한 사용자 정의 값을 지정할 수 있습니다.
  • DateField.auto_now_add
  • DateField- default=date.today부터 datetime.date.today()
  • DateTimeField- default=timezone.now부터 django.utils.timezone.now()
  • auto_now_add, auto_now및 옵션 default은 함께 사용할 수 없습니다. 이러한 옵션을 조합하면 오류가 발생합니다.
  • 현재 구현된 대로 auto_now또는 auto_now_addto True를 설정하면 필드가
  • have editable=False및 blank=True 설정됩니다

 

- DurationField(기간 필드)

   클래스 DurationField ( ** 옵션 ) ¶
  • 에 의해 Python에서 모델링된 기간을 저장하는 필드입니다 timedelta.
  • PostgreSQL에서 사용될 때 사용되는 데이터 유형은 an interval이고 Oracle에서 데이터 유형은 입니다.
  • 그렇지 않으면 마이크로초가 사용됩니다.INTERVAL DAY(9) TO SECOND(6)bigint
  • DurationField대부분의 경우 작동하는 산술 . 그러나 PostgreSQL 이외의 모든 데이터베이스에서 a의 값 DurationField 을 인스턴스의 산술 과 ​​비교하는 DateTimeField것은 예상대로 작동하지 않습니다.
    https://velog.io/@qlgks1/Django-Model-%ED%95%84%EB%93%9Cfiled-%EB%AA%A8%EC%9D%8C%EC%A7%91

BooleanField (참/거짓)

더보기

   클래스BooleanField ( **옵션 ) 

  • 참/거짓 필드.
  • 이 필드의 기본 양식 위젯은 CheckboxInput또는 NullBooleanSelectif null=True입니다.
  • 의 기본값 BooleanField은 정의되지 않은 경우입니다 None.Field.default
  • 기본으로 null=False라서 true/false를 가진다.
  • default값을 설정하지 않으면 None값이 나오기 때문에 주의한다.

- URL Field(URL)

더보기

- URLField

클래스 URLField ( max_length = 200 , ** 옵션 ) 

 CharField의해 검증된 URL의 경우 URLValidator.

이 필드의 기본 양식 위젯은 URLInput.

모든 CharField하위 클래스 와 마찬가지로 URLField선택적 max_length인수를 사용합니다. 를 지정하지 않으면 max_length기본값 200이 사용됩니다.

 

- SlugField

클래스 SlugField ( max_length = 50 , ** 옵션 ) 

민달팽이 는 신문 용어입니다. 슬러그는 문자, 숫자, 밑줄 또는 하이픈만 포함하는 짧은 레이블입니다.

일반적으로 URL에서 사용됩니다.

CharField와 마찬가지로 지정할 수 있습니다 max_length(데이터베이스 이식성에 대한 참고 사항 및 max_length해당 섹션 참조). 지정하지 않으면 max_length

Django는 기본 길이인 50을 사용합니다.로 설정 Field.db_index하는 것을 의미합니다 True.

다른 값의 값을 기반으로 SlugField를 자동으로 미리 채우는 것이 유용한 경우가 많습니다.를

사용하여 관리자에서 자동으로 이 작업을 수행할 수 있습니다 prepopulated_fields.

유효성 검사를 위해 validate_slug또는 을 사용합니다.validate_unicode_slug

SlugField.allow_unicode

인 경우 True필드는 ASCII 문자 외에 유니코드 문자도 허용합니다. 기본값은 False입니다.

이해를 돕기 위한 보조 POST 더보기↓

SlugField

class SlugField(max_length=50, **options)

# ex
from django.utils.text import slugify
class Article(models.Model):
    headline = models.CharField(max_length=100)
    . . .
    slug = models.SlugField(unique=True)

    def save(self, *args, **kwargs):
        self.slug = slugify(self.headline)
        super(Article, self).save(*args, **kwargs)
    . . .

>>> u1 = User.objects.get(id=1)
>>> from datetime import date
>>> a1 = Article.objects.create(headline="todays market report", pub_date=date(2018, 3, 6), reporter=u1)
>>> a1.save()
# 슬러그는 자동으로 생성됩니다. create 메서드를 따로 정의한 게 아닙니다.
>>> a1.slug
'todays-market-report'
  • 의미있는 URL을 만드는데 사용
  • 참고 사이트: https://itmining.tistory.com/119
  • 장점
    • 사람이 이해하기 좋다. (/1/ 보다 /blog/ 가 좋다)
    • 제목과 URL을 동일하게 맞춰 검색엔진 최적화(SEO)에 도움이 된다.

출처 및 참조 : https://velog.io/@nameunzz/Django-Model-Field

 


- FileField(추후 업데이트 예정)

더보기

class FileField ( upload_to = '' , storage = None , max_length = 100 , ** options ) 

파일 업로드 필드.

메모

인수 가 primary_key지원되지 않으며 사용할 경우 오류가 발생합니다.

다음 선택적 인수가 있습니다.

FileField.upload_to

이 속성은 업로드 디렉토리 및 파일 이름을 설정하는 방법을 제공하며 두 가지 방법으로 설정할 수 있습니다. 두 경우 모두 값이 Storage.save()메서드에 전달됩니다.

문자열 값 또는 를 지정 하면 파일 업로드 날짜/시간으로 대체되는 형식 Path이 포함될 수 있습니다 strftime()(업로드된 파일이 지정된 디렉토리를 채우지 않도록). 예를 들어:

class MyModel(models.Model):
    # file will be uploaded to MEDIA_ROOT/uploads
    upload = models.FileField(upload_to='uploads/')
    # or...
    # file will be saved to MEDIA_ROOT/uploads/2015/01/30
    upload = models.FileField(upload_to='uploads/%Y/%m/%d/')

기본값을 사용하는 경우 FileSystemStorage문자열 값이 MEDIA_ROOT경로에 추가되어 업로드된 파일이 저장될 로컬 파일 시스템의 위치를 ​​형성합니다. 다른 저장소를 사용하는 경우 해당 저장소의 설명서에서 어떻게 처리되는지 확인하십시오 upload_to.

upload_to함수와 같은 콜러블일 수도 있습니다. 파일 이름을 포함한 업로드 경로를 얻기 위해 호출됩니다. 이 콜러블은 두 개의 인수를 수락하고 스토리지 시스템에 전달할 Unix 스타일 경로(슬래시 포함)를 반환해야 합니다. 두 인수는 다음과 같습니다.

논쟁설명

instance FileField가 정의된 모델의 인스턴스입니다 . 보다 구체적으로 이것은 현재 파일이 첨부되는 특정 인스턴스입니다.
대부분의 경우 이 개체는 아직 데이터베이스에 저장되지 않았으므로 default AutoField를 사용하는 경우 아직 기본 키 필드에 대한 값이 없을 수 있습니다 .
filename 파일에 원래 지정된 파일 이름입니다. 이것은 최종 대상 경로를 결정할 때 고려되거나 고려되지 않을 수 있습니다.

예를 들어:

def user_directory_path(instance, filename):
    # file will be uploaded to MEDIA_ROOT/user_<id>/<filename>
    return 'user_{0}/{1}'.format(instance.user.id, filename)

class MyModel(models.Model):
    upload = models.FileField(upload_to=user_directory_path)

FileField.storage

저장소 개체 또는 저장소 개체를 반환하는 콜러블입니다. 이것은 파일의 저장 및 검색을 처리합니다. 이 개체를 제공하는 방법에 대한 자세한 내용은 파일 관리 를 참조하세요 .

이 필드의 기본 양식 위젯은 ClearableFileInput.

모델에서 a FileField또는 an ImageField(아래 참조)을 사용하려면 몇 가지 단계를 거쳐야 합니다.

  1. 설정 파일에서 MEDIA_ROOTDjango가 업로드된 파일을 저장할 디렉토리의 전체 경로를 정의해야 합니다. (성능을 위해 이러한 파일은 데이터베이스에 저장되지 않습니다.) MEDIA_URL해당 디렉터리의 기본 공개 URL로 정의합니다. 이 디렉토리가 웹 서버의 사용자 계정으로 쓰기 가능한지 확인하십시오.
  2. 업로드된 파일에 사용할 하위 디렉터리를 지정하는 옵션을 정의하여 모델에 또는를 FileField추가 합니다 .ImageFieldupload_toMEDIA_ROOT
  3. 데이터베이스에 저장되는 모든 것은 파일에 대한 경로입니다( 에 상대적 MEDIA_ROOT임). urlDjango에서 제공하는 편의 속성 을 사용하고 싶을 것 입니다. 예를 들어 ImageField가 이라고 mug_shot하면 을 사용하여 템플릿에서 이미지의 절대 경로를 가져올 수 있습니다 .{{ object.mug_shot.url }}

예를 들어 귀하 MEDIA_ROOT가 로 설정되어 '/home/media'있고 upload_to가 로 설정되어 있다고 가정합니다 'photos/%Y/%m/%d'. '%Y/%m/%d' 부분  형식화 upload_to입니다 . 는 네 자리 연도, 는 두 자리 월, 두 자리 일은 일입니다. 2007년 1월 15일에 파일을 업로드하면 디렉토리에 저장됩니다 .strftime()'%Y''%m''%d'/home/media/photos/2007/01/15

업로드된 파일의 디스크에 있는 파일 이름 또는 파일 크기를 검색하려면 name size속성을 각각 사용할 수 있습니다. 사용 가능한 특성 및 메서드에 대한 자세한 내용은 File클래스 참조 및 파일 관리 항목 가이드를 참조하세요.

메모

파일은 데이터베이스에 모델 저장의 일부로 저장되므로 디스크에 사용된 실제 파일 이름은 모델이 저장될 때까지 신뢰할 수 없습니다.

업로드된 파일의 상대 URL은 url속성을 사용하여 얻을 수 있습니다. 내부적으로 이것은 기본 클래스 의 url()메서드를 호출합니다 .Storage

업로드된 파일을 처리할 때마다 보안 허점을 피하기 위해 파일을 업로드하는 위치와 파일 유형에 세심한 주의를 기울여야 합니다. 업로드된 모든 파일의 유효성 을 검사 하여 파일이 생각한 것과 같은지 확인합니다. 예를 들어 누군가가 확인 없이 웹 서버의 문서 루트에 있는 디렉토리에 파일을 업로드하도록 맹목적으로 허용한 경우 누군가가 CGI 또는 PHP 스크립트를 업로드하고 사이트의 URL을 방문하여 해당 스크립트를 실행할 수 있습니다. 그것을 허용하지 마십시오.

또한 업로드된 HTML 파일도 브라우저에서 실행될 수 있기 때문에(서버에서는 실행되지 않음) XSS 또는 CSRF 공격에 해당하는 보안 위협이 될 수 있습니다.

FileField인스턴스는 varchar 기본 최대 길이가 100자인 열로 데이터베이스에 생성됩니다. max_length다른 필드와 마찬가지로 인수 를 사용하여 최대 길이를 변경할 수 있습니다 .

FileField그리고 FieldFile

클래스 FieldFile 

모델에서 에 액세스 하면 기본 파일에 액세스하기 위한 프록시로 FileField의 인스턴스가 제공 됩니다.FieldFile

의 API는 의 API를 FieldFile미러링하지만 File한 가지 중요한 차이점 이 있습니다. 클래스에 의해 래핑된 객체가 반드시 Python의 내장 파일 객체를 둘러싼 래퍼일 필요는 없습니다. Storage.open() 대신 메서드 의 결과를 감싸는 래퍼 로 File객체일 수도 있고 사용자 정의 저장소의 FileAPI 구현일 수도 있습니다.

 에서 상속된 API 외에도 에는 기본 파일 File 상호 작용하는 데 사용할 수 있는 여러 메서드가 포함되어 있습니다.read()write()FieldFile

경고

이 클래스의 두 가지 방법인 save() delete()는 기본적으로 연관된 모델 개체를 FieldFile데이터베이스에 저장하는 것입니다.

FieldFile.name

Storage연결된 의 루트에서 상대 경로를 포함하는 파일의 이름입니다 FileField.

FieldFile.path

기본 클래스 의 path()메서드를 호출하여 파일의 로컬 파일 시스템 경로에 액세스하기 위한 읽기 전용 속성 입니다.Storage

FieldFile.size

기본 Storage.size()메서드의 결과입니다.

FieldFile.url

기본 클래스 의 url()메서드를 호출하여 파일의 상대 URL에 액세스하는 읽기 전용 속성 입니다.Storage

FieldFile.open( 모드 = 'rb' ) 

지정된 에서 이 인스턴스와 연결된 파일을 열거나 다시 엽니다 mode. 표준 Python 메서드와 달리 open()파일 설명자를 반환하지 않습니다.

기본 파일은 액세스할 때 암시적으로 열리므로 기본 파일에 대한 포인터를 재설정하거나 mode.

FieldFile.close() 

표준 Python file.close()메서드처럼 동작하고 이 인스턴스와 연결된 파일을 닫습니다.

FieldFile.save( 이름 , 내용 , 저장 = True ) 

이 메서드는 파일 이름과 파일 콘텐츠를 가져와 필드의 스토리지 클래스에 전달한 다음 저장된 파일을 모델 필드와 연결합니다. FileField파일 데이터를 모델의 인스턴스 와 수동으로 연결하려는 경우 save() 해당 파일 데이터를 유지하는 방법이 사용됩니다.

두 개의 필수 인수 name를 사용합니다. 파일 이름과 content파일 내용을 포함하는 개체입니다. 선택적 save인수는 이 필드와 연결된 파일이 변경된 후 모델 인스턴스를 저장할지 여부를 제어합니다. 기본값은 True입니다.

인수 는 Python의 내장 파일 객체가 아니라 content의 인스턴스여야 합니다. 다음과 같이 기존 Python 파일 개체에서 django.core.files.Filea를 생성할 수 있습니다 .File

from django.core.files import File
# Open an existing file using Python's built-in open()
f = open('/path/to/hello.world')
myfile = File(f)

또는 다음과 같이 Python 문자열에서 하나를 구성할 수 있습니다.

from django.core.files.base import ContentFile
myfile = ContentFile("hello world")

자세한 내용은 파일 관리 를 참조하십시오 .

FieldFile.delete( 저장 =  ) 

이 인스턴스와 연결된 파일을 삭제하고 필드의 모든 속성을 지웁니다. delete()참고: 이 메소드는 가 호출 될 때 파일이 열려 있는 경우 파일을 닫습니다 .

선택적 save인수는 이 필드와 연결된 파일이 삭제된 후 모델 인스턴스를 저장할지 여부를 제어합니다. 기본값은 True입니다.

모델을 삭제해도 관련 파일은 삭제되지 않습니다. 분리된 파일을 정리해야 하는 경우 직접 처리해야 합니다(예: 수동으로 실행하거나 cron을 통해 주기적으로 실행하도록 예약할 수 있는 사용자 지정 관리 명령 사용).

https://www.dongyeon1201.kr/ff6d7a41-afb5-469f-ab55-50923d5773aa
https://www.dongyeon1201.kr/ff6d7a41-afb5-469f-ab55-50923d5773aa

- FilePathField(추후 업데이트 예정)

더보기

클래스 FilePathField ( 경로 = '' , 일치 = 없음 , 재귀

= False , allow_files = True , allow_folders = False , max_length = 100 , ** options ) 

CharField선택이 파일 시스템의 특정 디렉토리에 있는 파일 이름으로 제한되는

A. 몇 가지 특별한 인수가 있으며 첫 번째 인수가 필요합니다 .

FilePathField.path

필수의. FilePathField이것이 선택해야 하는 디렉토리에 대한 절대 파일 시스템 경로 입니다. 예: "/home/images".

path런타임에 경로를 동적으로 설정하는 함수와 같은 콜러블일 수도 있습니다. 예시:

import os
from django.conf import settings
from django.db import models

def images_path():
    return os.path.join(settings.LOCAL_FILE_DIR, 'images')

class MyModel(models.Model):
    file = models.FilePathField(path=images_path)
FilePathField.match

선택 과목. FilePathField 파일 이름을 필터링하는 데 사용할 정규 표현식(문자열)입니다 . 정규식은 전체 경로가 아닌 기본 파일 이름에 적용됩니다. 예: "foo.*\.txt$", 라는 파일과 일치 foo23.txt하지만 bar.txt또는 는 일치하지 않습니다 foo23.png.

FilePathField.recursive

선택 과목. 또는 . True_ False기본값은 False입니다. 모든 하위 디렉토리를 path포함해야 하는지 여부를 지정합니다.

FilePathField.allow_files

선택 과목. 또는 . True_ False기본값은 True입니다. 지정된 위치에 있는 파일을 포함해야 하는지 여부를 지정합니다. 이 또는 allow_folders이어야 합니다 True.

FilePathField.allow_folders

선택 과목. 또는 . True_ False기본값은 False입니다. 지정된 위치의 폴더를 포함해야 하는지 여부를 지정합니다. 이 또는 allow_files이어야 합니다 True.

한 가지 잠재적인 match문제점은 전체 경로가 아닌 기본 파일 이름에 적용된다는 것입니다. 따라서 이 예는 다음과 같습니다.

FilePathField(path="/home/images", match="foo.*", recursive=True)

… 일치 /home/images/foo.png하지만 가 기본 파일 이름( 및 ) /home/images/foo/bar.png 에 적용되기 때문에 일치하지 않습니다 .matchfoo.pngbar.png

FilePathField인스턴스는 varchar 기본 최대 길이가 100자인 열로 데이터베이스에 생성됩니다. max_length다른 필드와 마찬가지로 인수 를 사용하여 최대 길이를 변경할 수 있습니다 .

 

https://www.dongyeon1201.kr/ff6d7a41-afb5-469f-ab55-50923d5773aa

- ImageField(추후 업데이트 예정)

더보기

class ImageField ( upload_to = 없음 , height_field = 없음 , width_field = 없음 , max_length = 100 , ** options ) 

 pip install Pillow 
Syntax
field_name = models.ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)
참고용

에서 모든 속성과 메서드를 상속 FileField하지만 업로드된 개체가 유효한 이미지인지도 확인합니다.

FileField에 사용할 수 있는 특수 속성 외에도  속성 ImageField도 있습니다.heightwidth

이러한 속성에 대한 쿼리를 용이하게 하기 ImageField위해 다음과 같은 선택적 인수가 있습니다.

ImageField.height_field

모델 인스턴스가 저장될 때마다 이미지 높이로 자동 채워지는 모델 필드의 이름입니다.

ImageField.width_field

모델 인스턴스가 저장될 때마다 이미지 너비로 자동 채워지는 모델 필드의 이름입니다.

베개 라이브러리 가 필요합니다 .

ImageField인스턴스는 varchar 기본 최대 길이가 100자인 열로 데이터베이스에 생성됩니다. max_length다른 필드와 마찬가지로 인수 를 사용하여 최대 길이를 변경할 수 있습니다 .

이 필드의 기본 양식 위젯은 ClearableFileInput.

 

https://www.dongyeon1201.kr/ff6d7a41-afb5-469f-ab55-50923d5773aa

- BinaryField(2진법 데이터)

더보기

클래스BinaryField ( max_length=없음 , **옵션 ) 

원시 이진 데이터를 저장하는 필드입니다. bytes, bytearray또는 로 지정할 수 있습니다 memoryview.

기본적으로 로 BinaryField설정 editable되며 False이 경우 에 포함될 수 없습니다 ModelForm.

BinaryField하나의 추가 선택적 인수가 있습니다.

BinaryField.max_length

필드의 최대 길이(문자)입니다. 최대 길이는 Django의 유효성 검사에서 MaxLengthValidator.

학대BinaryField

데이터베이스에 파일을 저장하는 것에 대해 생각할 수도 있지만 99%의 경우 잘못된 설계임을 고려하십시오.

이 필드는 적절한 정적 파일 처리 를 대체 하지 않습니다 .

*이진 데이터(영어: Binary Data)는 기본 단위가 2개의 상태만 가지는 데이터이다.

 일반적으로 이진법 불 대수에서는 2개의 상태를 0과 +1로 나타낸다.

데이터는 저장시 serialize된다.

바이너리 데이터를 저장하므로이 필드는 필터에서 사용할 수 없다.


- GenericIPAddressField (IP주소를 저장하는 필드 / 'IPv4'와 'IPv6')

더보기

class GenericIPAddressField ( protocol = 'both' , unpack_ipv4 = False , ** options ) 

- IP주소를 저장하는 필드 /  'IPv4' 와 'IPv6' 모두 지원한다.

  • ex) 로그인 아이피주소
  • 문자열 형식(예: 192.0.2.30또는 2a02:42fe::4)의 IPv4 또는 IPv6 주소. 이 필드의 기본 양식 위젯은 TextInput.
  • IPv6 주소 정규화는 다음과 같습니다.RFC 4291#section-2.2 섹션 2.2, ::ffff:192.0.2.0. 예를 들어, 및2001:0::0:01정규화 됩니다. 모든 문자는 소문자로 변환됩니다.2001::1::ffff:0a0a:0a0a::ffff:10.10.10.10
  • GenericIPAddressField.protocol
  • 유효한 입력을 지정된 프로토콜로 제한합니다. 허용되는 값은 'both'(기본값) 'IPv4' 또는 'IPv6'입니다. 일치는 대소문자를 구분하지 않습니다.
  • GenericIPAddressField.unpack_ipv4
  • 와 같은 IPv4 매핑된 주소의 압축을 풉니다 ::ffff:192.0.2.1. 이 옵션이 활성화되면 해당 주소는 192.0.2.1. 기본값은 비활성화입니다. protocol가 로 설정된 경우에만 사용할 수 있습니다 'both'.
  • 빈 값을 허용하면 빈 값이 null로 저장되므로 null 값을 허용해야 합니다.

- JSONField(JSON 인코딩 데이터를 저장하기 위한 필드)

더보기

클래스 JSONField ( 인코더 = 없음 , 디코더 = 없음 , ** 옵션 ) 

JSON 인코딩 데이터를 저장하기 위한 필드입니다. Python에서 데이터는 사전, 목록, 문자열, 숫자, 부울 및 None.

JSONFieldMariaDB, MySQL 5.7.8+, Oracle, PostgreSQL 및 SQLite( JSON1 확장 사용 )에서 지원됩니다.

JSONField.encoder

json.JSONEncoder표준 JSON 직렬 변환기(예: datetime.datetime 또는 UUID) 에서 지원하지 않는 데이터 유형을 직렬화 하는 선택적 하위 클래스입니다. DjangoJSONEncoder예를 들어 클래스 를 사용할 수 있습니다 .

기본값은 json.JSONEncoder입니다.

JSONField.decoder

json.JSONDecoder데이터베이스에서 검색된 값을 역직렬화 하는 선택적 하위 클래스입니다. 값은 사용자 지정 인코더에서 선택한 형식(대부분 문자열)입니다. 역직렬화는 입력 유형을 확신할 수 없다는 사실을 설명해야 할 수 있습니다. datetime예를 들어, s 에 대해 선택한 것과 동일한 형식으로 된 문자열인 a를 반환할 위험이 있습니다

datetime.

기본값은 json.JSONDecoder입니다.

필드에 a 를 제공하는 경우 a default와 같은 변경 불가능한 객체 이거나 또는 함수 str와 같이 매번 새로운 변경 가능한 객체를 반환하는 호출 가능한 객체 인지 확인 dict하십시오. 변경 가능한 기본 객체를 제공 default={}하거나 default=[]모든 모델 인스턴스 간에 하나의 객체를 공유합니다.

JSONField데이터베이스에서 쿼리하려면 JSONField 쿼리 를 참조하세요 .

인덱싱

Index그리고 Field.db_index둘 다 B-트리 인덱스를 생성하는데, 이는 쿼리할 때 특별히 도움이 되지 않습니다 JSONField. GinIndexPostgreSQL에서만 더 적합한 것을 사용할 수 있습니다 .

PostgreSQL 사용자

PostgreSQL에는 두 가지 기본 JSON 기반 데이터 유형인 json및 가 jsonb있습니다. 그들 사이의 주요 차이점은 저장 방법과 쿼리 방법입니다. PostgreSQL의 json필드는 JSON의 원래 문자열 표현으로 저장되며 키를 기반으로 쿼리할 때 즉시 디코딩해야 합니다. 필드 는 jsonb인덱싱을 허용하는 JSON의 실제 구조를 기반으로 저장됩니다. jsonb장단점은 필드 에 쓰기에 약간의 추가 비용이 든다는 것 입니다. JSONField를 사용합니다 jsonb.

오라클 사용자

Oracle Database는 JSON 스칼라 값 저장을 지원하지 않습니다. JSON 개체 및 배열(Python에서 및 을 사용 dict하여 list표시됨)만 지원됩니다.


- UUIDField

더보기

클래스 UUIDField ( ** 옵션 ) 

보편적으로 고유한 식별자를 저장하기 위한 필드입니다. Python의 UUID클래스를 사용합니다. PostgreSQL에서 사용하는 경우 uuid데이터 유형에 저장하고 그렇지 않으면 char(32).

범용 고유 식별자는 for 의 좋은 대안 AutoField입니다 primary_key. 데이터베이스는 UUID를 생성하지 않으므로 다음을 사용하는 것이 좋습니다 default.

import uuid
from django.db import models

class MyUUIDModel(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # other fields

콜러블(괄호 생략)은 default의 인스턴스가 아니라 에 전달됩니다 UUID.

PostgreSQL에서 조회

iexactPostgreSQL에서 , contains, icontains, startswith, istartswith, endswith또는 조회를 사용하면 iendswithPostgreSQL이 하이픈으로 연결된 uuid 데이터 유형에 값을 저장하기 때문에 하이픈이 없는 값에는 작동하지 않습니다.


 

대표적으로 30여개의 Django에서의 Field에 대해 알아보았다.

(부족하게 적은 부분은 사용을 해가면서 보충할 예정이다)

 

 

 

 

그리고 DRF에도 같거나 추가적인 Field들도 있었다.

링크 : https://www.django-rest-framework.org/api-guide/fields/#string-fields

- 튜터님께 질문을 드렸다.

Q.기존 Django가 있는데 DRF에 serializer Field가 존재하는 이유가 무엇인지?

A.좋은 예시는 아니지만 당장 떠오르는게 없다.

   Model에 상품을 등록했다.

  상품필드에는 최저가 1000 ~ 최고가 10000원
  기존의 있던 모델을 건드리지 않고 평균값을 구하는 방법은?

  모델에서도 할수 있겠지만, 순수 데이터를 건드리고 싶지 않은 상황이라면  

  시리얼라이저 Field로 평균값을 리턴 5500원을 도출할 수 있다.

  좋은 예시는 아니지만 위와 같이 연산하는 용도도 있다.

 

 


 

 

이제 해당 Field에 줄 수 있는 여러 속성 대해 알아보자

 

 

  • null : DB 필드에 NULL 허용 여부 (디폴트 : False)
  • blank :입력값 유효성 (validation) 검사 시에 empty 값 허용 여부 (디폴트 : False)
  • choices : select box 소스로 사용
  • default : 디폴트 값 지정. 값이 지정되지 않았을 때 사용
  • help_text : 필드 입력 도움말
  • unique : 유일성 여부 (디폴트 : False)
  • verbose_name : 필드 레이블. 지정되지 않으면 필드명이 쓰여짐
  • validators : 입력값 유효성 검사를 수행할 함수를 다수 지정
                         각 필드마다 고유한 validators 들이 이미 등록되어있기도 함
                         예 : 이메일만 받기, 최대길이 제한, 최소길이 제한, 최대값 제한, 최소값 제한 등
  • auto_now_add : Bool, True 인 경우, 레코드 생성시 현재 시간으로 자동 저장
  • db_column : 해당 필드에서 사용할 DB 컬럼 이름이다. 이 값이 주어지지 않으면 필드명을                                                      그대로 사용한다.SQL 예약어를 사용한다거나 Python 변수로 사용할 수 없는 값을                                           사용할 때 이용한다.

    - 그외 속성 더보기 ↓

더보기
  • db_index 이 옵션이 True이면 Database는 이 필드에 Index를 만든다. 
  • editable 이 옵션이 False 인 경우 admin 페이지나 ModelForm 에 나타나지 않을 것이다. 기본값은 True 이다.
  • error_messages
  • primary_key 이 옵션이 True인 경우 모델의 Primary Key가 된다. Model에 Primary_key=True인 필드가 없다면 장고는 자동으로 Primary key를 위한 AutoField를 추가해 사용자가 의도적으로 primary_key를 설정할 필요가 없도록 한다. 
  • unique_for_date DateField나 DateTimeField에 유니크한 값을 저장해야 할 때 사용한다. 
  • unique_for_month DateField, DateTimeField 에서 사용하는 옵션이다.
    해당 날짜 필드 값의 월(Month) 값이 고유해야 되는지 여부
  • db_tablespace 덱스에 사용할 DB 테이블 스페이스의 이름입니다.
  • unique_for_year
  • DateField, DateTimeField 에서 사용하는 옵션이다.
    해당 날짜 필드 값의 연(year) 값이 고유해야 되는지 여부
https://www.dongyeon1201.kr/ff6d7a41-afb5-469f-ab55-50923d5773aa

          글을 정리하며 냉장고가 떠올랐다.

           엄마들이 모델링하면 더 잘하지 않을까?

 

결론 : 어떤 대상을 분류하고 체계화 하는데 있어서 모델링이 중요하다고 생각이 들었고

          그 대상들을 그룹화하여 관리하는 모델링을 하는데 데이터가 갖는 타입을 분류하는게 쉽지 않았다.

          검증을 해주는 타입을 정확히 모르기 때문에 이번 TIL을 통해 Django에서 제공해주는 타입에 대해
          알아보았고

          그 값에 속성을 부여하여 접근성과 옵션을 부여하여 좀더 확실하게 데이터를 활용한다는 측면에서

          Django가 꽤나 많은 노력을 기울인점을 배웠다.

          어떻게 해야 추상적인 데이터를 정형화 할수 있을까 라는 질문에

 

          장고는 나를 사용해봐라라고 답을 준것 같고

          Django를 다룰줄 안다면 여러 데이터를 효율적으로 관리하기 위해 쓰임에 맞게 틀을 만들 수 있다.

          단 그 성격에 맞는 타입(field)을 잘 적어줘라. 다시한번 프레임워크 뜻에 대해 생각해보게 되었다.

 

 

 

 

 

 

 

 

 

참조 : Django Model Field(nameun.zz)

참조 : Django Model - 필드(filed) 모음집(qlgks1)

참조 : Django field , 인자정리

참조 : Django 기본 05 - 모델(Model), 모델필드, 필드옵션

참고 : 냉장고사진

 

참고문서 : 장고 미디어 파일 (Media Files) - 사진업로드, 파일서빙

 

 

 

반응형