Поток, над которым я работаю, имеет
- A Таблица продуктов , классифицированная как Таблица категорий
- A Таблица дополнительных элементов , в которой перечислены параметры основной записи продукта в иерархическом порядке.
Аналогия. Рассмотрим корзину с иерархической структурой следующим образом -
- Ноутбуки и компьютерная периферия в таблице категории
- Ноутбуки в таблице Product Table
- HP в таблице необязательных элементов, таких вариантов может быть много
- HP Type A Parent в Дополнительные элементы Таблица
- HP Тип B Родитель в Дополнительные элементы Таблица
- HP Тип B Ребенок в Дополнительные элементы Таблица
- HP Тип C Super Parent в Дополнительные элементы Таблица
- HP Тип C Родитель в Дополнительные элементы Таблица
- HP Type C Child в Дополнительные элементы Таблица
- Lenovo в Таблица дополнительных элементов в Таблица дополнительных элементов
- Sony в Таблица дополнительных элементов в Таблица дополнительных элементов
- Видеокарта в Таблица продуктов
- Мобильные телефоны в категории Таблица
У меня есть следующие
models.py
class Product(models.Model):
productid = models.AutoField(primary_key=True)
productname = models.CharField(max_length=255, unique=True)
categoryid = models.ForeignKey(Categorytbl, db_column='CategoryID')
class Optionalitemstbl(models.Model):
optionid = models.AutoField(primary_key=True)
productid = models.ForeignKey(Product)
optionname = models.CharField(max_length=255, unique=True)
optionparentid = models.ForeignKey("self", related_name='+', blank=True, null=True)
def clean(self, *args, **kwargs):
if self.optionparentid and self.productid:
if self.optionparentid.optionid == self.optionid:
from django.core.exceptions import ValidationError
raise ValidationError('Option cannot be an option of itself')
return
super(Optionalitemstbl, self).save(*args, **kwargs)
Это позволяет мне создавать отношения, как показано выше.
Однако проблема в том, что он также допускает круговые отношения.Скажем, если пользователь внес листинг, как в приведенной выше аналогии на сайте администратора, он также может указать HP Type C Child в качестве родителя HP или любого издругие его родительские узлы в таблице.
Пожалуйста, предложите -
- Является ли это правильным подходом к упомянутой аналогии?
- Если это так, какие модификации помешаюттакие круговые отношения?
Спасибо!