2009-09-09 5 views
1

다음과 같이 내가 정의 선택을 말해봐 방법은 field를 모델로 저장하는 것입니다.스토어 장고 forms.MultipleChoiceField 직접

물론 forms.cleaned_data['field']을 반복하여 models.CommaSeperatedIntegerField에 맞는 값을 얻을 수 있습니다.

다시이 값을 검색 할 때마다 루프로 변환하고 옵션으로 변환해야합니다.

이렇게 좋은 방법이 있다고 생각합니다.이 방법으로 CommaSeperateIntegerField가해야 할 기능을 다시 구현하는 방법입니다.

답변

9

가장 먼저 고려해야 할 사항은 데이터베이스 스키마의 정상화입니다. 모델의 단일 인스턴스가이 필드에 대해 여러 값을 가질 수있는 경우 필드는 아마도 ForeignKey가있는 연결된 모델이어야합니다.

Postgres를 사용하는 경우 ARRAY 필드를 사용할 수도 있습니다. 장고는 이제 built-in support입니다.

그 중 하나를 수행 할 수 없다면 기본적으로 CommaSeparatedIntegerField (더 나은) 버전을 다시 구현해야합니다. 그 이유는 CommaSeparatedIntegerField가 a plain CharField whose default formfield representation is a regex-validated text input 이외의 것입니다. 다른 말로하면, 그것은 당신에게 유용한 어떤 것도하지 않습니다.

작성해야 할 것은 파이썬 목록을 필요로하고 파이썬 목록을 반환하지만 데이터베이스에 쉼표로 구분 된 문자열을 쉼표로 구분 된 문자열로 내부적으로 변환하는 사용자 지정 ListField 또는 MultipleValuesField입니다. documentation on custom model fields을 읽으십시오. 귀하의 경우 CharField의 하위 클래스를 두 가지 메서드, 즉 to_python (CSV 문자열을 파이썬 목록으로 변환) 및 get_db_prep_value (파이썬 목록을 CSV 문자열로 변환)으로 바꿔야한다고 생각합니다.

+0

'TextField'를 서브 클래스 화하는 것이 더 적합하다고 생각합니다. CharField는 max_length 인자를 요구하고 PostgreSQL'INT []'은 기대하지 않기 때문입니다. –

+0

@danilo PostgreSQL INT가 여기 관련이있는 이유를 모르겠다. 아이디어는 쉼표로 구분 된 정수를 정수가 아닌 필드에 저장하는 것이기 때문에. 어쨌든 TextField를 서브 클래 싱하는 것이 좋습니다. –

+0

죄송합니다, 분명히 두 가지 Stackoverflow 질문을 섞어. 내 요점은 - 누군가가 Postgres -INT []'필드에 목록을 저장하고 싶다면 커스텀 필드를 만들어서'TextField'를 확장해야한다는 것입니다. :) 그러나 그 주석은 여기에 맞지 않는 것처럼 보입니다. –

1

나는 Carl Meyer가 말했듯이 방금 같은 문제와 해결책을 보았습니다. 이 "문자열 목록"의 정규화 된 버전이 모델에 CharField 만있는 것은 원하지 않습니다. 이렇게하면 모델에 정규화 된 항목 목록이 저장됩니다. 내 경우에는 이것은 나라들입니다. XXX 내 국가 목록 2 배의 미리 계산 된 값이다

그래서 모델의 선언은

countries = CharField(max_lenght=XXX) 

입니다. 현재 국가가이 목록에 있는지 확인하기 위해 국가 표에 대한 M2M으로 확인하는 것보다는 우리가 확인하는 것이 더 간단하기 때문입니다.

+0

공식적인 django 문서에서 MultipleChoiceField가 적절한 문자열 목록으로 직렬화된다는 것이 명확하지 않다는 것을 지적해야합니다. –