Мне нужно найти объекты, у которых есть различия в Tags
у двух детей (модели с родным братом).
Пример настройки:
class Parent(models.Model):
pass
class Tag(models.Model):
name = models.CharField(max_length=256, unique=True)
class Child_OLD(models.Models):
parent = models.OneToOneField(Parent, ...)
tags = models.Many2ManyField(Tag)
class Child_NEW(models.Models):
parent = models.ForiegnKey(Parent, ...)
tags = models.Many2ManyField(Tag)
Я хочу убедиться, что все Tags
записи на Child_OLD представлены в записи Child_NEW
.В частности, я хотел бы найти любого родителя, у которого Child_OLD есть теги, которых нет у Child_NEW, используя более быстрый метод, чем проверка каждого из них в отдельности.
Меня интересует только поиск родителей, у которых child_old имеет тег, которыйне на child_new.Вот цикл, который выполняет похожую вещь:
diffs = []
for parent in parents:
cn_tags = Tag.objects.filter(child_new__parent=parent)
qs_diff = parent.child_old.tags.all().difference(cn_tags)
if qs.exists():
diffs.append(parent.pk)
Опять же, я собираюсь сделать это с набором запросов, более оптимизированным способом, так как итерация по каждому родителю очень медленная
Есть ~ 100 миллионов + "родители" и ~ 500 уникальных тегов.Типичный ребенок будет иметь 0-5 тегов