2011-04-25 4 views
1

나는 문서를 검색하고 살펴 보았지만 여기서 가장 좋은 해결책을 묻고 싶습니다.Django - 모델 선택

모델 선택을 정의하려고합니다.

  1. 라디오 선택에서 선택 '도하고하지 않도록, 예'나는 여러 선택

간단한 예를 들어 정의 할 방법

  • : 내 models.py에서 , 내가 가진

    class Property(models.Model): 
        name = models.CharField() 
    
    class Feature(models.Model): 
        YES_CHOICES = (  # example of 1, there can be only one selection 
         ('YES', 'Yes'), 
         ('NO', 'No'), 
         ('NOT_SURE', 'Not Sure') 
        ) 
        PARKING_CHOICES = ( # example of 2, there can be multiple selections 
         ('GARAGE', 'Garage'), 
         ('STREET', 'Street'), 
         ('PRIVATE_LOT', 'Private Lot'), 
         ('VALET', 'Valet'), 
        ) 
    
        nearby_school = models.CharField(max_length=8, choices=YES_CHOICES) 
        parking_options = models. MultipleChoiceField(choices=PARKING_CHOICES) 
    
    class PropertyFeature(models.Model) 
        property = models.ForeignKey(Property) 
        feature = models.ForeignKey(Feature) 
        ... 
    

    가장 좋은 방법은 무엇입니까?

    1. 대신 NullBooleanField를 사용해야합니까? 아니요, 확실하지 않은 질문입니까?
    2. 객관식 답변을 정의하고 저장하는 올바른 방법입니까? 가끔은 여러 가지 물건을 사용하는 사람들을 봅니다.

    장고에서 제공하는 가장 효율적이고 쉬운 방법을 사용하고 싶습니다.

  • 답변

    1

    예, NullBoolean이 적합하지만, NullBoolean의 프로필에 맞지 않는 옵션이 더있는 경우에는 옵션간에 가독성과 일관성을 위해 IntegerField을 선호합니다.

    Null은 직관적으로 n/a을 의미 할 수 있지만 더 많은 선택형 질문을 추가 할 때 정적 변수에 매핑 된 IntegerField을 사용하는 것이 더 직관적이라고 생각합니다.

    사용자가 이러한 기능을 기반으로 속성을 필터링하는 시나리오의 경우 동적 쿼리에서 Null을 특별한 경우 사용하지 않는 것이 유용합니다.

    예 :

    이 고대 포스트는 여전히 좋은 참고 자료로 제공
    ...filter(Q(nearby_school__isnull=True) | Q(nearby_school='NO')), 
        other_choice='SOME_CHOICE') 
    # vs 
    ...filter(Q(nearby_school=Feature.NOT_SURE) | Q(nearby_school=Feature.NO)), 
        other_choice=Feature.SOME_CHOICE) 
    

    : 다중 선택 필드로 http://www.b-list.org/weblog/2007/nov/02/handle-choices-right-way/

    class Feature(models.Model): 
        YES = 0 
        NO = 1 
        NOT_SURE = 2 
        SOMETIMES = 3 
        YES_CHOICES = ( 
         (YES, 'Yes'), 
         (NO, 'No'), 
         (NOT_SURE, 'Not Sure'), 
         (SOMETIMES, 'Sometimes'), # extensible. 
        ) 
    

    , 나는 M2M 필드를 사용하여 생각하십니까 가장 쉬운/가장 좋은 방법은.

    쉼표 & 디스플레이 적절하게 필드를 분리로 당신은 당신의 forms.MultipleChoiceField 저장하는 데이터를 설정할 수 있습니다,하지만 당신은 쉽게 M2M 필드를 조회 할 수 있다는 사실은 큰 이점이다 +는 ModelMultipleChoiceField으로 바로 작동합니다.

    +0

    [icontains] (http://docs.djangoproject.com/en/dev/ref/models/querysets/#icontains)를 사용하여 multiplechoicefields를 필터링 할 수 있습니까? – DTing

    +0

    네, 그렇 겠지.100 개의 옵션을 설정하려면 '01', '02'를 설정할 수 있습니다! –

    +0

    분명한 대답은 유진 감사합니다. 한 가지 더 질문합니다. 여러 개의 멀티 홉 항목이있는 경우 15 개의 다른 다중 선택 항목과 같이 말하면 15 개의 다른 여러 가지 관계가 필요합니다. 실적이 괜찮습니까? – DavidL

    4

    18 개월 정도 지나면 Django에서 choices을 더 잘 처리 할 수 ​​있습니다. Łukasz Langa's dj.choices. blog post introducing the project에서의 사용의 예 :

    from dj.choices import Choices, Choice 
    
    class Gender(Choices): 
        male = Choice("male") 
        female = Choice("female") 
        not_specified = Choice("not specified") 
    
    class User(models.Model): 
        gender = models.IntegerField(choices=Gender(), 
          default=Gender.not_specified.id) 
    
        def greet(self): 
         gender = Gender.from_id(self.gender) 
         if gender == Gender.male: 
          return 'Hi, boy.' 
         elif gender == Gender.female: 
          return 'Hello, girl.' 
         else: 
          return 'Hey there, user!' 
    

    이 여전히 있지만, 복수 선택이 작동하지 않습니다.