Добавление и удаление элементов в отношении 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
в обратном направлении . Вместо того, чтобы изменять BusinessUnitGroup
s путем удаления или добавления business_unit
. Мы просто устанавливаем businessunitgroup_set
s из business_unit
.
Задавая таким образом поле "многие-ко-многим", это обычно работает с двумя запросами: один удаляет все элементы, не входящие в forms_data['groups']
, а другой добавляет form_data['groups']
к business_unit
.