Как установить такое соединение в django?

Мне нужно реализовать "сквозное" соединение между продуктами.

вот так:

like this

Я автоматически проставляю двусторонние связи между двумя продуктами. Но когда я связываю продукт A с продуктом B и продукт B с продуктом C, между A и C нет связи. Необходимо, чтобы они сами связывались при простановке двух предыдущих связей.

Models.py

from django.db import models

class Part(models.Model):
    brand = models.CharField('Производитель', max_length=100, blank=True)
    number = models.CharField('Артикул', max_length=100, unique=True)
    name = models.CharField('Название', max_length=100, blank=True)
    description = models.TextField('Комментарий', blank=True, max_length=5000)
    analog = models.ManyToManyField('self',blank=True, related_name='AnalogParts')
    images = models.FileField('Главное изображение', upload_to = 'parts/', blank=True)
    images0 = models.FileField('Дополнительное фото', upload_to = 'parts/', blank=True)
    images1 = models.FileField('Дополнительное фото', upload_to = 'parts/', blank=True)
    images2 = models.FileField('Дополнительное фото', upload_to = 'parts/', blank=True)

    def __str__(self):
        return str(self.number)
        return self.name

    class Meta:
        verbose_name = 'Запчасть'
        verbose_name_plural = 'Запчасти'

Ваша диаграмма выглядит так, как будто Part соединены линейно. Самый простой способ добиться этого - добавить OneToOneFields к модели самостоятельно, как например:

next = models.OneToOneField('self', related_name='previous', null=True)

Тогда вы можете сделать что-то вроде

part = Part.object.get(name='wheel')
while part.next:
    part = part.next
# At this point Part is the last part in the row
print(part)

Это самый простой способ. В зависимости от того, есть ли у вас линейные связи между частями, вы должны настроить свои поля. Не существует решения всех проблем с графами, если только вы не реализуете некоторую структуру графа/базу данных, которая будет решать общие проблемы (я думаю, что GraphQL может делать такие вещи, но я не уверен). Также имейте в виду, что это, скорее всего, будет выполнять один SQL-запрос за итерацию цикла.

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