Как я могу «добавить» дополнительные данные (коды классификации) в существующее поле?Python

Программы на Python
Anonymous
Как я могу «добавить» дополнительные данные (коды классификации) в существующее поле?

Сообщение Anonymous »

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

Код: Выделить всё

    class ProductID(models.Model):
product_id = models.CharField(max_length=100, unique=True)
base_model = models.BooleanField(default=True)
active = models.BooleanField(default=True, choices=CHOICES)
possible_as_option = models.BooleanField(default=False, choices=CHOICES)
product_variant_data = models.ForeignKey('ProductVariantData', on_delete=models.PROTECT)
...

class ProductVariantData(models.Model):
short_text = models.CharField(max_length=300, null=True, blank=True)
packaging_unit = models.IntegerField(validators=[MinValueValidator(1)])
guarantee = models.IntegerField()
product = models.ForeignKey('Product', null=True, on_delete=models.PROTECT)
...

class Product(models.Model):
enec = models.BooleanField(default=False)
ce = models.BooleanField(default=True)
min_ambient_temperature = models.IntegerField()
max_ambient_temperature = models.IntegerField()
ip_code = models.ForeignKey(IPCode, on_delete=models.PROTECT)
ik_code = models.ForeignKey(IKCode, on_delete=models.PROTECT)
dimensions = models.ForeignKey(Dimensions)
cutout_dimensions = models.ForeignKey(CutoutDimensions, null=True)
product_type = models.ForeignKey(ProductType, on_delete=models.PROTECT)
....

class LEDData(models.Model):
led_changeable = models.BooleanField(default=True)
average_lifespan = models.IntegerField(null=True, blank=True)
dimmable = models.BooleanField(default=False)
voltage = models.DecimalField(max_digits=5, decimal_places=2, null=False)
flicker_metric = models.DecimalField(max_digits=2, decimal_places=1, null=True)
stroboscopic_effect_metric = models.DecimalField(max_digits=2, decimal_places=1, null=True)

class LEDData(models.Model):
average_lifespan = models.IntegerField()
dimmable = models.BooleanField(default=True)
voltage = models.DecimalField(max_digits=5, decimal_places=2, null=False)
flicker_metric = models.DecimalField(max_digits=2, decimal_places=1, null=True)
stroboscopic_effect_metric = models.DecimalField(max_digits=2, decimal_places=1, null=True)

class Luminaire(models.Model):
product = models.OneToOneField(Product, primary_key=True)
control_gear_included = models.BooleanField(default=True)
external_control_gear = models.BooleanField(default=True)
control_gear_changeable = models.BooleanField(default=True)
control_gears = models.ManyToManyField('ControlGear', through='LuminaireControlGearDetails')
led_data = models.ForeignKey(LEDData)
lighting_technology = models.CharField(max_length=15, choices=LightingTechnology, default=LightingTechnology.LED)
...

class LightColour(models.Model):
colour = models.CharField(max_length=50)

class PhotometricData(models.Model):
luminaire = models.ForeignKey(Luminaire)
lum_flux = models.IntegerField()
cri = models.IntegerField(validators=[MaxValueValidator(100), MinValueValidator(-100)])
power_details = models.ForeignKey('PowerDetails')
ldt_file = models.FileField(upload_to='data/ldt_files/', null=True)
light_curve = models.FileField(upload_to='data/light_curve/', null=True)
reference_settings = models.BooleanField(default=False)
colour_consistency = models.IntegerField(validators=[MaxValueValidator(7), MinValueValidator(1)])
colour_temperature = models.ForeignKey(ColourTemperature, on_delete=models.PROTECT,null=True, blank=True)
light_colour = models.ForeignKey()

class EmergencyLighting(models.Model):
product = models.OneToOneField(Product, primary_key=True)
....

class ControlGear(models.Model):
product = models.OneToOneField(Product, primary_key=True)
....
моя «проблема» сейчас: мы хотим классифицировать данные о наших продуктах с помощью системы ETIM (например, ссылку на потолочный светильник)
Эта классификация имеет систему с одним классом для каждой группы продуктов (например, «EC002892» для «Потолочный/настенный светильник»), кодами функций и кодами значений. Некоторым кодам функций требуется целое число, некоторым — логическое значение, а у других есть значения с кодом значения, где вам нужно выбрать ЕДИНИЦУ.
Один пример логического свойства (они называют его логическим):
Код «EF000137» — Описание «Dimmable» — введите «Logical» -> это должно быть «сопоставлено» с моим dimmable-BooleanField в классе LEDData.
Другой пример свойства с кодом значения (они называют его буквенно-цифровым)
Код «EF009350» — Описание «Цвет света» — введите «буквенно-цифровой» -> это должно быть «сопоставлено» с моим полем цвета CharField в классе LightColour.
Сначала я попробовал создать отдельный класс для всех свойств, но понятия не имею, как ссылаться на него из всех других классов. одно поле «многие-ко-многим» в каждом классе выглядит неправильно во многих отношениях. ПЛЮС... создавать формы позже было бы неинтересно..

Код: Выделить всё

    class ETIMClass(models.Model):
code = models.CharField(max_length=25)
short_description = models.CharField(max_length=100)
version = models.IntegerField()
etim_feature_codes = models.ManyToManyField('ETIMFeatureCode', through='ETIMFeatureCodeAdditions')

class ETIMFeatureCodeAdditions(models.Model):
etim_class = models.ForeignKey('ETIMClass', on_delete=models.PROTECT)
etim_feature_code = models.ForeignKey('ETIMFeatureCode', on_delete=models.PROTECT, null=True)
order = models.PositiveIntegerField()
class ETIMFeatureType(models.Model):
etim_feature_type = models.CharField(max_length=30)
short = models.CharField(max_length=10)

class ETIMFeatureCode(models.Model):
code = models.CharField(max_length=20)
value_codes = models.ManyToManyField('ETIMValueCode')
feature_type = models.ForeignKey(ETIMFeatureType, on_delete=models.PROTECT)

class ETIMValueCode(models.Model):
code = models.CharField(max_length=20)
text = models.CharField(max_length=150)

class PropertyType(models.Model):
type = models.CharField(max_length=25)

class Property(models.Model):
text = models.CharField(max_length=150, null=True, blank=True)
etim_code = models.ForeignKey(ETIMFeatureCode, null=True, blank=True,
on_delete=models.PROTECT)
type = models.ForeignKey(PropertyType, on_delete=models.PROTECT, null=False)

class ProductProperty(models.Model):
product_id = models.ForeignKey('ProductID', on_delete=models.PROTECT)
property = models.ForeignKey(Property, on_delete=models.PROTECT, null=False)
char_value = models.CharField()
int_value = models.IntegerField()
datetime_value = models.DateTimeField()
bool_value = models.BooleanField()
decimal_value = models.DecimalField(max_digits=7, decimal_places=3)
etim_value_code = models.ForeignKey(ETIMValueCode, on_delete=models.PROTECT, null=True)

@property
def value(self):
if self.product_property.type == "integer":
return self.int_value
elif self.product_property.type == "char":
return self.char_value
...
последняя идея. я сохраняю «путь» к каждому полю, которое мне нужно для конкретной функции и кода значения, в другом классе и использую getattr для поиска конкретного поля, но это тоже фигня....
В конце я хочу экспортировать эти данные в XML-файл с этой (сокращенной) схемой

Код: Выделить всё

    ETIM-7.0
EC000000

-
-

Для каждого классифицированного продукта в этом файле должны быть ВСЕ пары признак/значение в заранее определенном порядке. Хорошо, я могу сделать это полностью вручную, но если есть лучшее решение, я бы выбрал это.


Подробнее здесь: https://stackoverflow.com/questions/787 ... ting-field

Вернуться в «Python»