Django добавляет товары в категории с одинаковыми названиями

и я пытаюсь добавить товары в категории с тем же именем Например, это мои модели.

models.py

class Category(models.Model):
    headline = models.CharField(max_length=150)
    parent_category = models.ForeignKey('self', on_delete=models.CASCADE, related_name='children', null=True, blank=True)


class Product(models.Model):
    headline = models.CharField(max_length=150)
    category = models.ManyToManyField(Category, related_name = 'products')

views.py

#For Example I have Main Category Technic. that has 2 child categories (Mobile Phones and SmartPhones) and both have category Phone with same name See the Tree:
#Technic -> Mobile Phones -> Phone AND Technic -> SmartPhones -> Phone

Technic -> Мобильные телефоны -> Телефон - Содержит 4 продукта Technic -> SmartPhones -> Phone - Содержит 0 продуктов

Все, что я пытаюсь сделать, это проверить, если самая маленькая (дочерняя) категория имеет такое же имя, взять ее продукты и переместить в другую категорию телефонов в этой позиции

# Желаемый результат -> Technic -> Мобильные телефоны -> Телефон - Содержит 4 товара ( одинаковые товары ) Technic -> SmartPhones -> Phone - Содержит 4 товара (одинаковые товары), потому что оба последних дочерних имени кошек одинаковы.

Сначала необходимо определить, когда категория является младшим ребенком. Например, проверить, что не существует родительской категории. Затем получите набор категорий с одинаковым заголовком и, перебирая категории с наименьшим потомком, добавьте все категории с одинаковым заголовком к каждому товару.

for category in lowest_child_categories:
    # only if category has no parent
    if not category.parent_category_set.all().exists():

    # get all categories with same headline
    same_headlines = Categories.objects.filter(headline=category.headline)

    # for each associated product, add all other categories to product
    for product in category.products.all():
        for other_category in same_headlines:

            # only if no parent category exists
            if not other_category.parent_category_set.all().exists():

                # this will not duplicate association if already exists
                product.category.add(other_category)

В этом примере будет выполняться несколько лишних операций. Вы можете дополнительно настроить алгоритм для повышения производительности.

Вернуться на верх