Добавление и удаление связей ManyToManyField

Опубликовано 2021.08.11

Очень часто модель надо связать со множеством экземпляров другой модели. Например модель "Город" и модель "Район". В такой логике у нас будет один город и множество районов города. Связать такие модели можно через метод ManyToManyField.

Например:

  1. class City(models.Model):
  2. name = models.CharField(
  3. max_length=255,
  4. verbose_name="название города"
  5. )
  6. area = models.ManyToManyField(
  7. Area,
  8. verbose_name="район"
  9. )
  10.  
  11. class Area(models.Model):
  12. name = models.CharField(
  13. max_length=255,
  14. verbose_name="название района"
  15. )

Так у нас город будет связан со множеством районов.

Программно создать модели можно так:

  1. # создание города
  2. city = City.objects.create(name="Москва")
  3.  
  4. # создание районов
  5. area_1 = Area.objects.create(name="ЦАО")
  6. area_2 = Area.objects.create(name="ЗАО")
  7. area_3 = Area.objects.create(name="ЮАО")
  8.  
  9. # прикрепление районов к городу
  10. city.area.add(area_1)
  11. city.area.add(area_2)
  12. city.area.add(area_3)

Если нужно удалить одну связку ManyToManyField:

  1. # получение города
  2. city = City.objects.filter(name="Москва").first()
  3.  
  4. # получение района
  5. area = Area.objects.filter(name="ЦАО").first()
  6.  
  7. # удаление района у города
  8. city.area.remove(area)

Очистить все связки ManyToManyField:

  1. # получение города
  2. city = City.objects.filter(name="Москва").first()
  3.  
  4. # удаление всех районов города
  5. city.area.clear()