Итак, давайте предположим, что у вас есть данный Product
и вы хотите проверить , является ли другой данный Product
похожим на первый:
class Product(models.Model):
similar_products = models.ManyToManyField('self')
def is_similar(self, other):
if other in self.similar_products.all():
return True
else:
# recursively call is_similar()
return any(similar.is_similar(other) for similar in self.similar_products.all())
Это не требует добавления отношений при их создании. Так что теперь вы можете сделать a.is_similar(b)
, чтобы проверить, связаны ли a
и b
, и это вернет True
, если a
<=> c
<=> d
<=> b
.
Если вы предпочитаете явно добавлять все отношения при создании <=> c, используйте обработчик сигнала для m2m_changed
:
@receiver(m2m_changed, sender=Product):
def add_connections(sender, instance, action, **kwargs):
# instance is a
# pk_set contains the pk of c
if action == 'post_add':
for similar in instance.similar_products.all():
# similar is b for example (existing relationship with a)
similar.similar_products.add(Product.objects.filter(pk__in=pk_set))
Примечание: я изменил ваше поле similar_products
на множественное, так как оно должно быть в м2м.