지금 하고 있는 프로젝트는 분류가 많이 필요해 choice field에 대해 많이 알아보았다.
django model은 따로 choicefield가 없다. 대신 charfield를 설정하고, choices=선택할 카테고리를 설정해주면 된다.
from django.db import models
DATE_CHOICES=(
('plan','plan'),
('progress','progress'),
('end','end')
)
class Post(models.Model):
```
date_category=models.CharField(choices=DATE_CHOICES, max_length=50)
```
def __str__(self):
return f'[{self.pk}]{self.title} :: {self.user}'
이런식으로...하면 된다.
하지만 나는 json형식으로 전달해줘야하기 때문에...serializer도 만들어야 한다!
serializer에서는 choicefield를 제공한다. 하지만 model=post로 받아와줬기 때문에 굳이 따로 작성은 안했음
만약 한다면 date_category=models.ChoiceField(choices=DATE_CHOICES, max_length=50)이런식으로 하면 될듯
이번에는 다중선택을 시도해야한다.
혹시나 했지만 django의 기본 모델에는 그러한 필드가 존재하지 않는다. serializer의 모델에는 mutiplechoice가 존재하지만...django의 charfield로 저장을 해봤더니 제대로 저장이 되지 않았다.
다중선택을 하고 싶으면 새로운 모델 라이브러리를 다운받아야 한다. pip install django-multiselectfield
단!!!문제가 있다!!!
이 라이브러리는 python3.4+, django 2.0+까지만 지원을 하므로 만약 이 필드를 쓰고 싶다면 먼저 django를 다운그레이드 해주자!!!
난 만들어둔게 많아서...이 라이브러리는 사용하지 않았다. 그래도 만약 쓰는 날을 위해...새 폴더에다 연습했다.
pip install django==2.0을 해준뒤에 위에 적힌대로 설치를 해주고, settings의 설치 앱에 'multiselectfield'해준다.
from django.db import models
from multiselectfield import MultiSelectField
MY_CHOICES=(
('jobseeker','jobseeker'),
('license','license'),
('exam','exam'),
('gradschool','gradschool')
)
class Post(models.Model):
my_category=MultiSelectField(choices=MY_CHOICES, max_length=16, max_choices=3)
def __str__(self):
return f'[{self.pk}]'
임시로 만들어준 models.py!
max_choices도 잘 설정된다. max_length와 max_choices 조건이 두개나 있어서 저렇게 뜨지만 3개이하 선택 제한 조건이 잘 적용된다.
여기서 또 문제가 생겼다. serializer에서는 multiselectfield를 따로 제공하지만, 여기에는 max_choices와 같은 옵션이 따로 존재하지 않는다. 따라서 drf에서 값을 넘겨주면 제한 없이 database에 선택한 값들이 전부 들어가게 된다.
고민을 많이 했다. view에서 my_category의 갯수를 샌다음 제한을 넘으면 save가 안되게 한다든지...
프론트 쪽에서 선택에 제한을 걸어서 아예 값을 못넘기게는 못하나??
이전에 했던 프로젝트에서 그렇게 했던 것 같은데...
찾아보니까 js를 이용해서 가능하다.
var limit = 3;
$('input.single-checkbox').on('change', function(evt) {
if($(this).siblings(':checked').length >= limit) {
this.checked = false;
}
})
백에서 해결할 수 있다면 좋겠지만...일단 프론트에서 해결 가능하니 여기까지 해야될듯~
공식문서
https://www.django-rest-framework.org/api-guide/fields/#choicefield
'django > 정리' 카테고리의 다른 글
AWS 배포(4) - SSH 연결 및 docker 관리 (1) | 2023.05.24 |
---|---|
AWS 배포(3) - https, 도메인 (0) | 2023.05.24 |
AWS 배포(2) - EC2, RDS, github action (0) | 2023.05.24 |
AWS 배포(1) - Django, Nginx, Gunicorn (0) | 2023.05.23 |
CEOS Readme 정리 - 4주차:DRF2 : Simple JWT & Permission (0) | 2023.05.08 |