Как установить такое соединение в django?
Мне нужно реализовать "сквозное" соединение между продуктами.
вот так:
Я автоматически проставляю двусторонние связи между двумя продуктами. Но когда я связываю продукт 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
соединены линейно. Самый простой способ добиться этого - добавить OneToOneField
s к модели самостоятельно, как например:
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-запрос за итерацию цикла.