Лучшие практики сортировки по выбору в django

Думаю, все знакомы с Counter Strike Global Offensive (CS:GO). Так вот там у нас оружие разделено по типам (Pistol, SMG, Rifle, Heavy). Каждый тип имеет несколько видов оружия (например, AK-47, M4A4, AWP - это оружие винтовочного типа. У меня есть следующая модель в моем проекте Django:

class Weapon(models.Model):
    WEAPONS = (
        ('AK-47', 'AK-47'),
        ('M4A4', 'M4A4'),
        ...
    )

    QUALITY_CONSUMER_GRADE = 'CONSUMER GRADE'
    QUALITY_INDUSTRIAL_GRADE = 'INDUSTRIAL GRADE'
    QUALITY_MIL_SPEC = 'MIL-SPEC'
    QUALITY_RESTRICTED = 'RESTRICTED'
    QUALITY_CLASSIFIED = 'CLASSIFIED'
    QUALITY_COVERT = 'COVERT'
    QUALITY = (
        (QUALITY_CONSUMER_GRADE, 'Consumer grade'),
        (QUALITY_INDUSTRIAL_GRADE, 'Industrial grade'),
        (QUALITY_MIL_SPEC, 'Mil-spec'),
        (QUALITY_RESTRICTED, 'Restricted'),
        (QUALITY_CLASSIFIED, 'Classified'),
        (QUALITY_COVERT, 'Covert')
    )

    CATEGORY_NORMAL = 'NORMAL'
    CATEGORY_STATTRAK = 'STATTRAK'
    CATEGORY = (
        (CATEGORY_NORMAL, 'Normal'),
        (CATEGORY_STATTRAK, 'StatTrak')
    )

    TYPE_PISTOL = 'PISTOL'
    TYPE_HEAVY = 'HEAVY'
    TYPE_SMG = 'SMG'
    TYPE_RIFLE = 'RIFLE'
    TYPE = (
        (TYPE_PISTOL, 'Pistol'),
        (TYPE_HEAVY, 'Heavy'),
        (TYPE_SMG, 'SMG'),
        (TYPE_RIFLE, 'Rifle')
    )

    EXTERIOR_FACTORY_NEW = 'FACTORY NEW'
    EXTERIOR_MINIMAL_WEAR = 'MINIMAL WEAR'
    EXTERIOR_FIELD_TESTED = 'FIELD-TESTED'
    EXTERIOR_WELL_WORN = 'WELL-WORN'
    EXTERIOR_BATTLE_SCARRED = 'BATTLE-SCARRED'
    EXTERIOR = (
        (EXTERIOR_FACTORY_NEW, 'Factory New'),
        (EXTERIOR_MINIMAL_WEAR, 'Minimal Wear'),
        (EXTERIOR_FIELD_TESTED, 'Field-Tested'),
        (EXTERIOR_WELL_WORN, 'Well-Worn'),
        (EXTERIOR_BATTLE_SCARRED, 'Battle-Scarred')
    )

    name = models.CharField(max_length=64, choices=WEAPONS, default=WEAPONS[0][0])
    exterior = models.CharField(max_length=64, choices=EXTERIOR, default=EXTERIOR[0][0])
    quality = models.CharField(max_length=64, choices=QUALITY, default=QUALITY[0][0])
    category = models.CharField(max_length=64, choices=CATEGORY, default=CATEGORY[0][0])
    type = models.CharField(max_length=64, choices=TYPE, default=TYPE[0][0])
    price = models.FloatField()
    slug = models.SlugField(max_length=256, unique=True, editable=False)

Какова наилучшая практика автоматического сохранения типа оружия, будь то винтовка или тяжелое оружие и т.д., основываясь на оружии (например, если это AK-47, поле типа модели должно быть Rifle). Хорошая ли это идея добавить словарь или что-то подобное в атрибуты модели и определять тип оружия при сохранении модели следующим образом:

class Weapon(models.Model):
    ...

    WEAPON_TYPES = {
        TYPE_RIFLE: ('AK-47', 'M4A4', 'AWP',...),
        TYPE_PISTOL: ('Desert Eagle', 'USP-s'),
        ...
    }

    def save(self, *args, **kwargs):
        for type in WEAPON_TYPES:
            if self.name in WEAPON_TYPES[type]:
                self.type = type
        return super().save(*args, **kwargs)

Главное преимущество заключается в том, что разработчик программного обеспечения теперь имеет доступ к доступному состоянию с помощью переменной, а не жестко закодированной строки.

class MyChoice:
    varient_type = (
        (0, 'Image'),
        (1, 'Catelog'),
        (2,'Features'),
        (3, "Description")
    )
    cart_type = (
        (0, 'Cart'),
        (1, 'Wishlist'),
        (3, 'Order')
    )
    product_status = (
        (0, 'Process'),
        (1, 'Available'),
        (2, 'Out Of Stock')
        
    )
    
Вернуться на верх