Добавление и удаление элементов в отношении ManyToMany в Django

У меня есть следующая модель:

class BusinessUnitGroup(models.Model):
    name = models.CharField(max_length=255)
    business_units = models.ManyToManyField(to=BusinessUnit, blank=True, null=True)
    capacity = models.IntegerField(null=True, blank=True)

    def __unicode__(self):
        return self.name

Теперь в представлении у меня есть поля с идентификаторами групп, куда нужно добавить бизнес-единицу. Из другого поля ее нужно удалить, если она существует. Я делаю это следующим образом:

business_unit = get_or_none(BusinessUnit, id=business_unit_id)

# Groups
old_groups = BusinessUnitGroup.objects.exclude(id__in=form_data['groups'])
for group in old_groups:
    group.business_units.remove(business_unit)

new_groups = BusinessUnitGroup.objects.filter(id__in=form_data['groups'])
for group in new_groups:
    group.business_units.add(business_unit)

Где form_data['groups'] является параметром и это просто список идентификаторов [1, 2, 3]

Это работает хорошо, но есть ли какой-нибудь лучший способ сделать это?

Да, вы можете работать с .set(…) [Django-doc]:

business_unit = get_or_none(BusinessUnit, id=business_unit_id)
business_unit.businessunitgroup_set.set(form_data['groups'])

Таким образом, мы работаем с ManyToManyField в обратном направлении . Вместо того, чтобы изменять BusinessUnitGroups путем удаления или добавления business_unit. Мы просто устанавливаем businessunitgroup_sets из business_unit.

Задавая таким образом поле "многие-ко-многим", это обычно работает с двумя запросами: один удаляет все элементы, не входящие в forms_data['groups'], а другой добавляет form_data['groups'] к business_unit.

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