2011-05-06 6 views
9

모델의 서브 클래스에 다른 choices을 사용할 수 있습니까? 다음 코드는 내가 유지 mixin을 사용하고 있는데 그 이유는 내가 (다른 모델간에 공유 할 수있는 속성/선택을해야한다는 것입니다 당신에게 아이디어동일한 필드, Django 모델 서브 클래스의 다른 선택

class Clothing(models.Model): 
    size = models.CharField(max_length=1) 
    colour = models.CharField(max_length=1) 

SHIRT_SIZES = { 
    'S','Small', 
    'M','Medium', 
    'L','Large', 
} 

class TShirt(models.Model): 
    size = models.CharField(max_length=1, choices=SHIRT_SIZES) 

MENS_CHOICES = { 
    'K','Black', 
    'R','Red', 
    'B','Blue', 
} 

class MensColours(models.Model): 
    colour = models.CharField(max_length=1, choices=MENS_CHOICES) 

class MensShirt(MensColours, TShirt): 
    class Meta: 
     verbose_name = "men's shirt" 

WOMENS_CHOICES = { 
    'P','Pink', 
    'W','White', 
    'B','Brown', 
} 

class WomensColours(models.Model): 
    colour = models.CharField(max_length=1, choices=WOMENS_CHOICES) 

class WomensShirt(WomensColours, TShirt): 
    class Meta: 
     verbose_name = "women's shirt" 

를 제공해야합니다 예를 들어, 또한 여성/남성 바지, 같은있을 수 있습니다 필요 색상 선택은 TShirt보다 다른 크기 선택). 그러나 전반적으로 모든 의류는 색상과 크기가 있습니다.

어떻게해야합니까?

답변

5

아니요. 잠재적 필드는 상위 항목에서 고정됩니다. 양식 필드에 대한 유효한 선택 사항을 지정하여 양식에서이 문제를 해결할 수는 있지만 모델 필드의 근본적인 특성은 변경할 수 없습니다.

+0

감사합니다. 부모로부터 필드를 제거해야합니다 :-) – Lexo

+4

그래도 여전히 사실입니까? 기본 클래스 란 추상적이거나 함수에서 오는 선택입니까? – Pureferret

+0

반복 가능해야하며 함수가 없습니다. – byashimov

2

믹스는 이러한 종류의 문제를 해결하는 올바른 방법입니다. 그러나 필드를 매 수업마다 서로 의존해야한다면 또 다른 방법이 있습니다.
클래스의 정의에서 필드를 정의해야합니다. 즉, 수업을 진행하는 과정을 해킹해야한다는 의미입니다. 왜냐하면 그것이 창조 된 후에는 그것이 구체화되기 때문입니다. 그 후에 필드를 변경할 수있는 기회가 있는지 전혀 모르겠습니다.

from django.db import models 
from django.db.models.base import ModelBase 


class ApparelMeta(ModelBase): 
    def __new__(mcs, name, bases, attrs): 
     meta = attrs.get('Meta', None) 

     # We should check if it is the end class 
     # because django's class inheritance is not pythonic 
     if meta and not getattr(meta, 'abstract', None) \ 
      and not attrs.get('_deferred'): 
      sizes = models.CharField(max_length=1, choices=attrs['SIZES']) 
      colors = models.CharField(max_length=1, choices=attrs['COLORS']) 

     return super(ApparelMeta, mcs).__init__(mcs, name, bases, attrs) 


class Apparel(models.Model): 
    __metaclass__ = ApparelMeta 

    class Meta: 
     abstract = True 
     index_together = (
      ('sizes', 'colors'), 
     ) 

# Now you can create all that classes: men, women, children 

class MensApparel(Apparel): 
    COLORS = { 
     'K','Black', 
     'R','Red', 
     'B','Blue', 
    } 

    SIZES = { 
     'S','Small', 
     'M','Medium', 
     'L','Large', 
    } 


class WomensApparel(Apparel): 
    COLORS = { 
     'R','Red', 
    } 

    SIZES = { 
     'S','Small', 
    } 
관련 문제