Сгруппированы ли CATEGORY_CHOICES с несколькими вариантами подуровня? - PullRequest
1 голос
/ 16 марта 2020

Возможно ли иметь организованный выбор, чтобы иметь более одного уровня в названных группах.

Или я должен сделать это совершенно по-другому, не используя варианты.

Django документы имеют документацию только на одном уровне, на котором я смог работать. enter image description here

https://docs.djangoproject.com/en/3.0/ref/models/fields/

Первый элемент в каждом кортеже - это имя, которое будет применяться к группе. Второй элемент представляет собой итерацию из 2-х кортежей, причем каждый 2-кортеж содержит значение и удобочитаемое имя для опции. Сгруппированные параметры могут быть объединены с не сгруппированными параметрами в одном списке (например, параметр «неизвестно» в этом примере).

Я хочу создать класс, поэтому при добавлении метеоритов он попадает в надлежащую классификацию, но также наследует верхние уровни. Например, шерготтский метеорит - это также дифференцированные метеориты, марсианские метеориты.

  • дифференцированные метеориты
    • марсианские
      • шерготтиты

Я нашел это в Django проекте, который близок к тому, что мне нужно, но Есть несколько дополнительных уровней организации.

MEDIA_CHOICES = [
    ('Audio', (
            ('vinyl', 'Vinyl'),
            ('cd', 'CD'),
        )
    ),
    ('Video', (
            ('vhs', 'VHS Tape'),
            ('dvd', 'DVD'),
        )
    ),
    ('unknown', 'Unknown'),
]

Ниже я пытаюсь сделать следующее: создать две широкие категории с 3 и 4 подкатегориями и внутри тех, у каждого из которых может быть до двух. подкатегории.

Позже эта группа будет импортирована для сортировки, поиска и большей функциональности.

Вот диаграмма НАСА, которую я использую для классификации в качестве картинки

NASA Meteorite Classification Chart

В тексте

undifferentiated meteorites
    chodrites
        carbonaceous
            CB
            CH
            CK
            CM
            CR
            CV
            CO
            CI

        ordinary
            H
            L
            LL

        rumuruti
            R

        enstatite
            EH
            EL

differentiated meteorites

    achodrites
        primitive achodrites
            iodranities
            acapulcoites
            winonaites
        martian
            shergottites
            nakhites
            chassignites
            ALH 84001 opx
        aubrites
        urelities
        HED
            eurites
            diogenites
            howardites
        angrites
        brachinites
        lunar
            feldspathic breccia
            basaltic
            polymict

    stony iron meteorites
        pallasite
        mesosiderites

    iron metoerites
        IAB
        IIAB
        IIIAB
        IVAB
        Ungrouped
        Other

Я нашел это в Django проекте, который близок к тому, что мне нужно, но есть несколько дополнительных уровней организации.

MEDIA_CHOICES = [
    ('Audio', (
            ('vinyl', 'Vinyl'),
            ('cd', 'CD'),
        )
    ),
    ('Video', (
            ('vhs', 'VHS Tape'),
            ('dvd', 'DVD'),
        )
    ),
    ('unknown', 'Unknown'),
]

Это то, чего я смог достичь, но это полный лев Я не могу достичь желаемого результата.

from django.db import models
from django.utils import timezone


class Post(models.Model):
    CATEGORY_CHOICES = [
        ('iron metoerites', (
            ('IAB', 'IAB'),
            ('IIAB', 'IIAB'),
            ('IIIAB', 'IIIAB'),
            ('IVAB', 'IVAB'),
            ('Ungrouped', 'Ungrouped'),
            ('Other', 'Other'),
            )
         ),
        ('stony meteorites', 'stony meteorites'),
        ('primitive achodrites', (
            ('iodranities', 'iodranities'),
            ('acapulcoites', 'acapulcoites'),
            ('winonaites', 'winonaites'),
            )
         ),
        ('carbonaceous', (
            ('CB', 'CB'),
            ('CH', 'CH'),
            ('CK', 'CK'),
            ('CM', 'CM'),
            ('CR', 'CR'),
            ('CV', 'CV'),
            ('CO', 'CO'),
            ('CI', 'CI'),
            )
         ),
        ('ordinary', (
            ('H', 'H'),
            ('L', 'L'),
            ('LL', 'LL'),
            )
         ),
        ('rumuruti', (
            ('R', 'R'),
            )
         ),      
        ('enstatite', (
            ('EH', 'EH'),
            ('EL', 'EL'),
            )
        ),
        ('martian', (
            ('shergottites', 'shergottites'),
            ('nakhites', 'nakhites'),
            ('chassignites', 'chassignites'),
            ('ALH84001opx', 'ALH 84001 opx'),
            )
         ),
        ('HED', (
            ('eurites', 'eurites'),
            ('diogenites', 'diogenites'),
            ('howardites', 'howardites'),
            )
         ),
        ('angrites', 'angrites'),
        ('brachinites', 'brachinites'),
        ('lunar', (
            ('feldspathic_breccia', 'feldspathic breccia'),
            ('basaltic', 'basaltic'),
            ('polymict', 'polymict'),
            )
             ),
        ('stony-iron meteorites', (
            ('pallasite', 'pallasite'),
            ('mesosiderites', 'mesosiderites'),
            ),
         ),
        ]

    main_image = models.FileField(upload_to='media/', default='')
    second_image = models.FileField(upload_to='media/', default='')
    author = models.CharField(max_length=256, default='')
    title = models.CharField(max_length=256, default='')
    description = models.TextField(default='')
    more_info = models.TextField(default='')
    l_heading = models.CharField(max_length=256, default='')
    l_heading_text = models.CharField(max_length=256, default='')
    qoute = models.CharField(max_length=256, default='')
    qoute_name = models.CharField(max_length=256, default='')
    s_heading = models.CharField(max_length=256, default='')
    s_heading_text = models.CharField(max_length=256, default='')
    category = models.CharField(
        max_length=256, choices=CATEGORY_CHOICES, default='stony meteorites')
    created_date = models.DateTimeField(default=timezone.now, blank=True)
    text = models.TextField(default='')
    tag_1 = models.CharField(max_length=256, default='')
    tag_2 = models.CharField(max_length=256, default='')
    tag_3 = models.CharField(max_length=256, default='')
    class Meta:
        ordering = ['-created_date']
    def __str__(self):
        return self.title

Я самообучаюсь с помощью базовых c Django учебных пособий и базового c поиска в Google по поиску и устранению неисправностей, которые работали до этого. Я открыт для любого решения, но мне было интересно, как лучше добавить что-то с несколькими вложениями внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...