2011-05-06 29 views
9

o modellerin alt sınıfları için choices farklı kullanmak mümkün mü alt sınıfların? Aşağıdaki kod Ben katmalar kullanıyorum sebebi (farklı modeller arasında paylaşılabilir nitelikleri/seçimler olması size bir fikirAynı alan Django modelinde farklı seçenekler

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" 

vermelidir örn da kadın/erkek pantolon, aynı olabilir haiz renk seçimleri ama TShirts'dan farklı boyut seçenekleri). Bununla birlikte, genel olarak, tüm kıyafetlerin bir rengi ve bir boyutu vardır.

Bunu nasıl yapmalıyım?

cevap

5

sayılı Potansiyel saha seçimler ebeveyn sabitlenir. Form alanı için geçerli seçimleri belirterek bu şekilde bir formda alabilirsiniz, ancak model alanının temel niteliğini değiştiremezsiniz.

+0

OK Teşekkürler - Alanın ebeveyn tarafından temizlenmesi gerekiyor :-) – Lexo

+4

Bu hala doğru mu? Temel sınıf soyut ya da seçimler bir işlevden mi geliyor? – Pureferret

+0

Yinelenebilir olmalı ve işlevler değil. – byashimov

2

Katmalar konularda bu tür çözmeye doğru yoldur. Ama eğer alanların her bir sınıfta birbirine bağlı olması gerekiyorsa, başka bir yol var.
Sen sınıfın çözünürlükle alanı tanımlamak gerekir. Bu, sınıf oluşturma sürecini kesmeniz gerektiği anlamına gelir. Çünkü yaratıldıktan sonra somutlaşır. Bundan sonra alanı değiştirmek için bir şansın olup olmadığı konusunda hiçbir fikrim yok.

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', 
    } 
İlgili konular