Django ३ फील्ड चॉइस को परिभाषित करने का एक नया तरीका लेकर आया: field.choices। यह कुछ लाभ लाता है, उदा। विशिष्टता को लागू करता है और मानव पठनीय टैग की आपूर्ति की अनुमति देता है।

दुर्भाग्य से, मुझे गैर-डीजेंगो मॉड्यूल में विकल्पों को परिभाषित करने का एक साफ तरीका नहीं मिल रहा है, ताकि इन विकल्पों को गैर-डीजेंगो अनुप्रयोगों से आयात किया जा सके। ठोस रूप से:

  • मेरे django ऐप में, मेरे पास एक आकार हो सकता है जिसमें रंग हों।
  • इन रंग विकल्पों का उपयोग मेरे django मॉडल में किया जाना है, लेकिन अन्य गैर-django पैकेजों में भी जिन्हें सभी मान्य विकल्पों को जानने की आवश्यकता है (उदा। विश्लेषण)

इसलिए मैं इन रंगों को एक ही स्थान पर स्टैंड-अलोन क्लास के रूप में परिभाषित करना चाहता हूं, उदाहरण:

class ShapeColor(Enum):
    BLUE = 1
    GREEN = 2
    RED = 3

अतीत में मैंने इस Enum 'ShapeColor' को कहीं भी आयात किया था जिसकी मुझे आवश्यकता थी। लेकिन मुझे इस एनम को नए मॉडल में अनुवाद करने का एक साफ तरीका नहीं मिला है। इंटेगर चॉइस क्लास। मैंने अपने Enum से विरासत में पाने की कोशिश की:

class ColorChoices(models.IntegerChoices, ShapeColors):
    pass

लेकिन निश्चित रूप से यह एक TypeError ("गणना का विस्तार नहीं कर सकता") देता है।

यह बहुत अच्छा होगा अगर किसी के पास मौजूदा एनम या इसी तरह के निर्माण से django पसंद एनम को स्पष्ट रूप से प्राप्त करने के बारे में कोई सुझाव था।

2
Celmar Y. 8 पद 2020, 15:35

1 उत्तर

सबसे बढ़िया उत्तर

Django कोड में थोड़ा सा खोदने पर, यह पता चलता है कि Choices, IntegerChoices, और TextChoices सभी Django के मूल Enum डेटा प्रकार के संस्करण हैं। तो, व्यवहार्यता मानते हुए, करने के लिए सबसे आसान काम ShapeColor को सीधे models.IntegerChoices के रूप में बनाना होगा। यदि यह संभव नहीं है (हो सकता है कि जहां आपके अन्य उपकरण चल रहे हों, वहां Django उपलब्ध नहीं है), तो अगली सबसे अच्छी बात ColorChoices को ShapeColor से बनाना होगा:

ColorChoices = model.IntegerChoices(
        'ColorChoices',
        [(m.name, m.value) for m in ShapeColor],
        )
1
Ethan Furman 8 पद 2020, 18:21