Лучшие практики сортировки по выбору в 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')
)