I've been researching how to use add, create, remove, clear, and set several times. It is troublesome to read English each time, so I will summarize it in Japanese. Django Documentation / Related objects reference
from django.db import models
class Reporter(models.Model):
pass
class Article(models.Model):
title = models.CharField(max_length=255, null=True)
reporter = models.ForeignKey(Reporter, on_delete=models.CASCADE)
r1 = Reporter.objects.create(name='reporter1')
r2 = Reporter.objects.create(name='reporter2')
a1 = Article.objects.create(title='article1', reporter=r1)
a2 = Article.objects.create(title='article2', reporter=r1)
a3 = Article.objects.create(title='article3', reporter=r2)
add(*objs, bulk=True, through_defaluts=None) You can update the foreign key of the child table in the parent-child relationship by using the add method.
Example of use
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>
>>> r2.article_set.all()
<QuerySet [<Article: Article object (3)>]>
>>> r2.article_set.add(a1,a2)
>>> r1.article_set.all()
<QuerySet []>
>>> r2.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>
bulk=False
You can pass an unsaved object as an argument by using bulk = False
.
However, as bulk = False
, queries will be issued for the number of objects to be added.
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>]>
>>> new_a1 = Article()
>>> new_a2 = Article()
>>> r1.article_set.add(new_a1, new_a2, bulk=False)
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (4)>, <Article: Article object (5)>]
INSERT INTO `article` (`reporter_id`) VALUES (1) # new_a1
INSERT INTO `article` (`reporter_id`) VALUES (1) # new_a2
create(through_defaluts=None, **kwargs) By using the create method, you can create a new record with a small amount of description.
>>> r1.article_set.create()
>>> r1.article_set.all()
<QuerySet [<Article: Article object (1)>, <Article: Article object (2)>, <Article: Article object (3)>]>
This has similar results to:
>>> new_a = Article(reporter=r1)
>>> new_a.save()
>>> r1.article_set.all()
remove(*objs, bulk=True)
remove ()
will update the ForeignKey to Null.
It can be used only when ForeignKey (null = True)
.
If you set Foreign Key (null = True)
in the Model prepared above, you can use it as follows.
>>> r1.article_set.remove(a1, a2)
bulk=False
You can also update records one by one by passing bulk = False
as with add ().
>>> r1.article_set.remove(a1, a2, bulk=False)
>>> r1.article_set.all()
<QuerySet []>
If bulk = True
,QuerySet.update ()
is called, but if bulk = False
, save ()
is called multiple times.
clear(bulk=True)
clear ()
updates the Foreign Keys of all children to Null.
Like clear ()
, it can be used only when ForeignKey (null = True)
.
>>> r1.article_set.clear()
>>> r1.article_set.all()
<QuerySet []>
bulk=False
>>> r1.article_set.clear(bulk=False)
>>> r1.article_set.all()
<QuerySet []>
As with remove (), save ()
is called multiple times.
set(objs, bulk=True, clear=False, through_defaults=None) GitHub link for set (OneToMany)
In set ()
, ʻadd (),
remove (), and
clear ()are running. If you pass
bulk = True / False as an argument,
bulk` will be included in the argument of these methods running inside.
clear=False
>>> r1.article_set.set([a1, a3], bulk=False)
Is the same as:
>>> r1.article_set.remove(a2, bulk=False)
>>> r1.article_set.add(a1, a3, bulk=False)
clear=True
>>> r1.article_set.set([a1, a3], clear=True)
Is the same as:
>>> r1.article_set.clear()
>>> r1.article_set.add(a1, a3)
I've read the documentation about Django's Related objects again. In particular, my understanding of the options passed as arguments was ambiguous, so I hope it helps someone similar.