{{{
>>> p = Product.objects.all()[0]
>>> p
<Product: <Product pk=587 barcode=041390007019>>
>>> p.images.set([1])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 750, in set
self.add(*objs, bulk=bulk)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 656, in add
check_and_update_obj(obj)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 648, in
check_and_update_obj
raise TypeError("'%s' instance expected, got %r" % (
TypeError: 'ProductImage' instance expected, got 1
}}}
{{{
class Product(m.Model):
pass
}}}
{{{
class ProductImage(m.Model):
product = m.ForeignKey(
Product,
on_delete=m.CASCADE,
related_name='images',
)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31282>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
Old description:
New description:
{{{
>>> i = ProductImage.objects.get(pk=100)
>>> p.images.set([100])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 750, in set
self.add(*objs, bulk=bulk)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 656, in add
check_and_update_obj(obj)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 648, in
check_and_update_obj
raise TypeError("'%s' instance expected, got %r" % (
TypeError: 'ProductImage' instance expected, got 100
--
Comment (by YLiLarry):
{{{
>>> i = ProductImage.objects.get(pk=100)
>>> p.images.set([100])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 750, in set
self.add(*objs, bulk=bulk)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 656, in add
check_and_update_obj(obj)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 648, in
check_and_update_obj
raise TypeError("'%s' instance expected, got %r" % (
TypeError: 'ProductImage' instance expected, got 100
}}}
However, this works fine:
{{{
p.images.set([i])
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:1>
Old description:
> {{{
> >>> i = ProductImage.objects.get(pk=100)
> >>> p.images.set([100])
> Traceback (most recent call last):
> File "<console>", line 1, in <module>
> File "/usr/local/lib/python3.8/dist-
> packages/django/db/models/fields/related_descriptors.py", line 750, in
> set
> self.add(*objs, bulk=bulk)
> File "/usr/local/lib/python3.8/dist-
> packages/django/db/models/fields/related_descriptors.py", line 656, in
> add
> check_and_update_obj(obj)
> File "/usr/local/lib/python3.8/dist-
> packages/django/db/models/fields/related_descriptors.py", line 648, in
> check_and_update_obj
> raise TypeError("'%s' instance expected, got %r" % (
> TypeError: 'ProductImage' instance expected, got 100
New description:
It seems that I can no longer pass a list of pks to
RelatedManager.set(..).
Alternatively, passing a list of objects works as expected.
{{{
>>> p = Product.objects.all()[0]
>>> p
<Product: <Product pk=587 barcode=041390007019>>
>>> p.images.set([1])
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 750, in set
self.add(*objs, bulk=bulk)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 656, in add
check_and_update_obj(obj)
File "/usr/local/lib/python3.8/dist-
packages/django/db/models/fields/related_descriptors.py", line 648, in
check_and_update_obj
raise TypeError("'%s' instance expected, got %r" % (
TypeError: 'ProductImage' instance expected, got 1
class Product(m.Model):
...
class ProductImage(m.Model):
product = m.ForeignKey(
Product,
on_delete=m.CASCADE,
related_name='images',
)
}}}
--
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:2>
* cc: Tobias Kunze (added)
* component: Uncategorized => Documentation
* severity: Normal => Release blocker
* stage: Unreviewed => Accepted
Comment:
`RelatedManager.set()` for reverse relations has never accepted a list of
IDs (unlike many-to-many).
There is a regression in docs introduced in
a44a21a22f20c1a710670676fcca798dd6bb5ac0
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:3>
* owner: nobody => Carlton Gibson
* status: new => assigned
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:4>
* has_patch: 0 => 1
* stage: Accepted => Ready for checkin
Comment:
[https://github.com/django/django/pull/12466 PR]
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:5>
Comment (by Carlton Gibson <carlton@…>):
In [changeset:"a34cb5a6d408203f4fbdb364fc9768c026eda224" a34cb5a]:
{{{
#!CommitTicketReference repository=""
revision="a34cb5a6d408203f4fbdb364fc9768c026eda224"
Refs #31282 -- Clarified M2O add/remove/set with PK behaviour.
Improved error message for remove() and added tests.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:7>
* status: assigned => closed
* resolution: => fixed
Comment:
In [changeset:"3bbf9a489afc689eff2f4a0b84af196aa1ef51e7" 3bbf9a48]:
{{{
#!CommitTicketReference repository=""
revision="3bbf9a489afc689eff2f4a0b84af196aa1ef51e7"
Fixed #31282 -- Corrected RelatedManager docs for using add/remove/set
with PKs.
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:6>
Comment (by Carlton Gibson <carlton.gibson@…>):
In [changeset:"611d1c114835310a0cd963e20f3e9782c34db847" 611d1c11]:
{{{
#!CommitTicketReference repository=""
revision="611d1c114835310a0cd963e20f3e9782c34db847"
[3.0.x] Fixed #31282 -- Corrected RelatedManager docs for using
add/remove/set with PKs.
Backport of 3bbf9a489afc689eff2f4a0b84af196aa1ef51e7 from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:8>
Comment (by Carlton Gibson <carlton.gibson@…>):
In [changeset:"7deb87c93e5f45ded3ccd1e6162bed6a30000af8" 7deb87c9]:
{{{
#!CommitTicketReference repository=""
revision="7deb87c93e5f45ded3ccd1e6162bed6a30000af8"
[2.2.x] Fixed #31282 -- Corrected RelatedManager docs for using
add/remove/set with PKs.
Backport of 3bbf9a489afc689eff2f4a0b84af196aa1ef51e7 from master
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/31282#comment:9>