Пример несколько более сложный, чем у вас, но суть такая же
class ListKeyProperty(models.Model):
"""
Реестр свойств
"""
name = models.CharField(verbose_name='Название', max_length=64)
uom = models.CharField(verbose_name='единица измерения', max_length=16, blank=True, null=True,)
def str(self):
return self.name
class Categories(models.Model):
"""
Категории изделий
"""
name = models.CharField("название", max_length=100)
slug = models.SlugField(u"чпу", max_length=100, unique=True)
order = models.IntegerField(verbose_name='Порядковый номер', blank=True, null=True)
hidden = models.BooleanField("Скрыть", default=None)
available_properties = models.ManyToManyField(ListKeyProperty, verbose_name='Доступные свойства', blank=True)
def str(self):
return '%s' % (self.name)
class Product(models.Model):
"""
Модель продукта
"""
name = models.CharField("название", max_length=100)
slug = models.SlugField("чпу", max_length=100, unique=True)
category = models.ForeignKey(Categories, verbose_name='Принадлежит категории')
...
def save(self):
super(Product, self).save()
for key_property_category in self.category.available_properties.all():
check_cat_prop_in_product = False
for item_property_product in self.property_product.all():
if not item_property_product.key in self.category.available_properties.all():
item_property_product.delete()
if key_property_category == item_property_product.key:
check_cat_prop_in_product = True
if check_cat_prop_in_product == False:
new_item_property = Property(key=key_property_category, product=self)
new_item_property.key = key_property_category
new_item_property.save()
class Property(models.Model):
"""
Свойства, связанные с изделием. Используется либо value, либо диапазон value - second_value,
либо предустановленные значения из списка preset_value
"""
key = models.ForeignKey(ListKeyProperty, verbose_name='Название')
int_value = models.FloatField(verbose_name='Значение цифр.', blank=True, null=True,)
str_value = models.CharField(verbose_name='Значение строк.', max_length=128, blank=True, null=True,)
product = models.ForeignKey(Product, verbose_name=u'связан с моделью', blank=True, null=True, related_name=u'property_product')
def str(self):
return self.key.name
в админке примерно так
class PropertyInlineForm(ModelForm):
class Meta:
model = Property
fields = (...)
class PropertyInline(admin.TabularInline):
model = Property
form = PropertyInlineForm
extra = 0
can_delete = False
max_num = 1
class ProductAdmin(admin.ModelAdmin):
list_display = ()
list_editable = ()
inlines = [ImageProductInline, PropertyInline]
Что то я без доп комментариев не могу понять что происходит, можете описать поподробнее что бы разобраться?