на данный момент моя модель выглядит (немного укороченной) вот так
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)
....
Эта классификация имеет систему с одним классом для каждой группы продуктов (например, «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
...
В конце я хочу экспортировать эти данные в XML-файл с этой (сокращенной) схемой
Код: Выделить всё
ETIM-7.0
EC000000
-
-
Подробнее здесь: https://stackoverflow.com/questions/787 ... ting-field