От многих до многих. ORM Django

class Toy(models.Model): name = models.CharField(max_length=20) desc = models.TextField() class Box(models.Model): name = models.CharField(max_length=20) proprietor = models.ForeignKey(User, related_name='User_Box') toys = models.ManyToManyField(Toy, blank=True) 

Как создать представление, добавляющее игрушку в ящик?

 def add_this_toy_to_box(request, toy_id): 

2 Solutions collect form web for “От многих до многих. ORM Django”

Вы можете использовать связанный с ним RelatedManager Django:

«Связанный менеджер» – это менеджер, используемый в контексте «один-ко-многим» или «ко многим-многим». Это происходит в двух случаях:

«Другая сторона» отношения ForeignKey. То есть:

 class Reporter(models.Model): ... class Article(models.Model): reporter = models.ForeignKey(Reporter) 

В приведенном выше примере приведенные ниже методы будут доступны в менеджере reporter.article_set .

Обе стороны отношения ManyToManyField:

 class Topping(models.Model): ... class Pizza(models.Model): toppings = models.ManyToManyField(Topping) 

В этом примере методы ниже будут доступны как на topping.pizza_set и на pizza.toppings .

У этих связанных менеджеров есть несколько дополнительных методов:

  1. Чтобы создать новый объект, он сохраняет его и помещает в соответствующий набор объектов. Возвращает вновь созданный объект: create (** kwargs)

     >>> b = Toy.objects.get(id=1) >>> e = b.box_set.create( ... name='Hi', ... ) # No need to call e.save() at this point -- it's already been saved. # OR: >>> b = Toy.objects.get(id=1) >>> e = Box( ... toy=b, ... name='Hi', ... ) >>> e.save(force_insert=True) 
  2. Чтобы добавить объекты модели к соответствующему набору объектов:

     add(obj1[, obj2, ...]) 

    Пример:

     >>> t = Toy.objects.get(id=1) >>> b = Box.objects.get(id=234) >>> t.box_set.add(b) # Associates Box b with Toy t. 
  3. Чтобы удалить указанные объекты модели из соответствующего набора объектов:

     remove(obj1[, obj2, ...]) >>> b = Toy.objects.get(id=1) >>> e = Box.objects.get(id=234) >>> b.box_set.remove(e) # Disassociates Entry e from Blog b. 

    Чтобы предотвратить несогласованность базы данных, этот метод существует только для объектов ForeignKey, где null = True. Если связанное поле не может быть установлено в None (NULL), то объект не может быть удален из отношения, не будучи добавленным к другому. В приведенном выше примере удаление e из b.entry_set () эквивалентно выполнению e.blog = None, а потому, что в блоге ForeignKey нет null = True, это неверно.

  4. Удаляет все объекты из связанного объекта: clear ()

     >>> b = Toy.objects.get(id=1) >>> b.box_set.clear() 

    Обратите внимание, что это не удаляет связанные объекты – он просто разбирает их. Подобно remove (), clear () доступен только на ForeignKeys, где null = True.


Ссылка: соответствующий документ Django для обработки связанных объектов

Django автоматически создает обратные отношения на ManyToManyFields, поэтому вы можете делать:

 toy = Toy.objects.get(id=toy_id) toy.box_set.add(box) 
  • Django self join, Как преобразовать этот запрос в запрос ORM
  • Оптимизация запросов к базе данных в структуре Django REST
  • Когда Django просматривает первичный ключ внешних ключей?
  • LEFT JOIN Django ORM
  • Предполагается, что django prefetch_related работает с GenericRelation
  • Django 1.8 ArrayField добавляет и расширяет
  • Django: метод Custom Save для отношения Many-to-Many
  • Поле модели Django Blob
  • Python - лучший язык программирования в мире.