2011-01-16 5 views
2

피클 링 된 일련의 문자열이있는 모델이 있습니다. (장고 세트 필드에 내장 더 있기 때문에 그것은 바로, 절인 할 수 없습니다?)장고 관리 인터페이스와 피클 세트

class Foo(models.Model): 

    __bar = models.TextField(default=lambda: cPickle.dumps(set()), primary_key=True) 

    def get_bar(self): 
     return cPickle.loads(str(self.__bar)) 

    def set_bar(self, values): 
     self.__bar = cPickle.dumps(values) 

    bar = property(get_bar, set_bar) 

내가 세트가 관리 인터페이스에서 편집 할 수 싶습니다. 분명히 사용자는 절인 문자열을 직접 사용하지 않을 것입니다. 또한 인터페이스에는 세트에서 문자열을 추가/제거하기위한 위젯이 필요합니다.

이렇게하는 가장 좋은 방법은 무엇입니까? 나는 장고의 관리자 시스템에 익숙하지 않다. 맞춤 관리자 위젯이나 다른 것을 만들 필요가 있습니까?

업데이트 : 나는 사용자 정의 위젯을해야하는 경우,이 도움이 보인다 : http://www.fictitiousnonsense.com/archives/22

업데이트 2은 : 지금은 문제가 해결되는지 확인하기 위해 다른 관계형 모델을 찾고 있어요. 내가 놀겠다는 거있어 하나 개의 아이디어 :이의

class FooMember(models.Model): 
     name = models.CharField(max_length=120) 
     foo = models.ForeignKey('Foo') 

class Foo(models.Model): 
     def get_names(self): 
      return FooMember.objects.filter(foo__exact=self) 

단점은 다음과 같습니다 그것은 하나 개의 데이터 필드 (name)에 대한 전체 모델을 만들기 위해 과도한 느낌

  • .
  • Foo에 대한 관리 인터페이스에서 사용자가 문자열 목록을 입력 할 수있게하고 싶습니다. 나는이 설정으로 어떻게 할 지 모르겠다. 사용자 정의 양식 위젯을 만드는 것이 덜 효과적 인 것처럼 보입니다.
+0

ManyToManyField는 세트와 유사합니다. 문자열을 다른 모델의 'unique = True' 필드로 만들고 Foo에 해당 모델의 ManyToManyField를 포함시킬 수 있습니까? –

+0

"하나의 데이터 필드 (이름)에 대해 전체 모델을 작성하는 것이 과도하다고 느낍니다."- 이런 식으로 느끼지만 데이터베이스 테이블의 행에 불과합니다. – osa

답변

3

엄. Django는 대개 SQL 데이터베이스에 데이터를 저장합니다. 피클 링 된 문자열로 세트를 저장하는 것은 SQL 데이터베이스를 사용하는 가장 좋은 방법은 아닙니다. 그것은 귀하의 경우에 맞는 솔루션이 즉각적으로 명백하지 않습니다. 그것은 그 세트에있는 것이 무엇인지에 달려 있지만 어떤 경우에도 잘못된 솔루션입니다.

해당 세트에 대한 새 테이블을 원하거나 적어도 쉼표로 구분 된 값 또는 다른 것으로 저장할 수 있습니다.

+0

잘못된 접근 방식을 설명 할 수 있습니까? 세트에는 ~ 10 개 이상의 항목이 없으므로 빠른 조회 시간이 필요하지 않습니다. 또한, CSV는 어떤 장점이 있습니까? (피클 링하는 항목이 세트가 아닌 경우 더 많은 불평을 제외하고) –

+0

CSV의 장점은 파이썬이 없더라도 읽을 수 있다는 것입니다. 피클의 모든 것을 원한다면, ZODB는 피클을 기반으로 한 객체 지향 데이터베이스를 사용하십시오. 그것은 당신이 가지고있는 SQL 데이터베이스를 사용하기 때문에 잘못된 접근법입니다. 이식성이 없으며, 구현하기가 복잡합니다. 부서지기 쉽고 부서지기 쉽습니다. 그것에 대해 전혀 설득력있는 것은 없습니다. –