2011-05-06 10 views
9

क्या मॉडल के उप-वर्गों के लिए अलग choices का उपयोग करना संभव है? निम्नलिखित कोड आप एक विचारसमान क्षेत्र, Django मॉडल उपclasses में विभिन्न विकल्प

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" 

देना चाहिए कारण मैं mixins उपयोग कर रहा हूँ मैं गुण/विकल्प (विभिन्न मॉडलों के बीच साझा किया जा सकता है वह यह है कि जैसे भी महिलाओं की/पुरुषों की पैंट, एक ही हो सकता है जो होने कलर विकल्प लेकिन टीशर्ट्स की तुलना में अलग-अलग आकार विकल्प)। कुल मिलाकर, हालांकि, सभी कपड़ों में रंग और आकार होता है।

मुझे यह कैसे करना चाहिए?

उत्तर

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', 
    } 
संबंधित मुद्दे