221226 TIL

haremeat·2022년 12월 26일
0

Django

목록 보기
14/16
post-thumbnail
post-custom-banner

한글에서 같은 글자를 다르게 인식하는 경우

오늘은 옆자리 동료가 마주한 버그를 같이 해결하는 시간을 가졌다.
내 일보다 재밌는 남의 버그... 프론트팀 시니어 팀장님과 내가 적극적으로 나섰다 ㅎㅎㅎㅎ
버그 내용은 심플했다. 분명 같은 글자인데 같다고 인식하지 못하는 문제였다.
처음에는 byte로 변환했을 때 다르길래 인코딩 문제인줄 알고 시간낭비를 좀 했는데 원소 하나하나를 출력해보면 자음 모음이 분리된 상태로 되어있는 걸 볼 수 있었다. 자세한 설명과 해결방법은 아래 블로그에 나와있다.

https://jonsyou.tistory.com/26

str = '고구마'
unicodedata.normalize('NFC',str)

이런 식으로 합쳐서 해결하면 된다.


editable=False가 정확히 하는 일

Model 영역에서 수정 불가능한 필드를 만들어야 한다고 할 때 어떻게 하는 게 좋을까?
제일 먼저 생각나는 건 필드에 editable=False를 지정하는 것이다.
하지만 drf를 쓰는 어플리케이션이라면 이 방법은 사용해서는 안 된다.
써봤더니 serializer에서 자동으로 해당 필드를 read_only 필드로 만들어서 생성시에도 필드를 못 받게 한다.
어째서일까??

editable

If False, the field will not be displayed in the admin or any other ModelForm. They are also skipped during model validation. Default is True.

document를 읽어보면 editable이 False일 경우 admin 및 ModelForm 등에서 표시되지 않게 한다고 나와있다. 물론 model validation에도 걸리지 않는다.

editable=False는 "사용자로부터 수정되지 않도록한다"에 포커스 맞춰져 있기 때문에 사용자로부터 입력을 받아 모델객체 값을 수정하도록 하는 서드파티 라이브러리도 해당 철학을 따르도록 기능구현을 해준것이라는 예상을 할 수 있다.

내가 하려는 건 어떠한 상황에서도 해당 필드가 수정되지 않도록 하는 것이었으므로 애초에 editable=False는 사용해선 안 된다.


constraint로 수정 불가능한 필드를 만드는 게 가능할까?

어떻게든 만들어보려 했지만...
현재로선 불가능하다는 결과가 나온다.
사실 처음부터 constraint로 해결이 안 되면 trigger로 해결보려고 했지만
그래도 방법을 찾고 싶었다.

class SampleModel(models.Model):
    field1 = models.CharField(_('샘플 필드'), max_length=50)
    
    class Meta:
        constraints = [
            models.CheckConstraint(
                check=(Q(pk__isnull=True) & Q(field1__isnull=False)) | \
                      Q(pk_isnull=False) & Q(field1__exact=models.F("field1")),
                name='field1_editable_false',
                violation_error_message=_('수정 불가능한 필드입니다.')
            )
        ]

시도한 흔적...
제일 중요한 현재 값을 가져올 방법이 없어서 안 된다.
안 돼요.
됐었는데?
아니 그냥 안 돼요.

결론은 trigger

애초에 이럴 때 쓰라고 pgtrigger가 있는 것이다.

profile
버그와 함께하는 삶
post-custom-banner

0개의 댓글