Создание иерархической базы данных на сайте администратора Django - PullRequest
0 голосов
/ 02 марта 2012

Поток, над которым я работаю, имеет

  1. A Таблица продуктов , классифицированная как Таблица категорий
  2. 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 или любого издругие его родительские узлы в таблице.

Пожалуйста, предложите -

  1. Является ли это правильным подходом к упомянутой аналогии?
  2. Если это так, какие модификации помешаюттакие круговые отношения?

Спасибо!

...