Opened 19 months ago

Closed 12 days ago

Last modified 12 days ago

#21144 closed Cleanup/optimization (fixed)

Not possible to update foreign key by id for a queryset

Reported by: dakinsloss@… Owned by: vaskalas
Component: Database layer (models, ORM) Version: 1.5
Severity: Normal Keywords: update, related model, performance
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Attempting to minimize queries when updating list of ModelA instances that have foreign keys to ModelB, and I know the ids of the new ModelB instances I want to use for the instances of ModelA (that I only have the id for, not the instance).

Trying:
ModelA.objects.filter(pk=id_of_a_instance).update(b_id=id_of_b_instance) which yields 'FieldNameDoesNotExist' because 'get_field_by_name' only has 'b' as a field name for ModelA, not b_id (which is strange given that is what is actually stored).

Then I try:
ModelA.objects.filter(pk=id_of_a_instance).update(b=id_of_b_instance), which says it needs an instance of ModelB, not a number.

Which means I will be stuck with an extra query:
model_b_list = list(ModelB.objects.filter(id_in=[list of ids for a instances])
and then have to iterate through the ModelA instances and assign the actual ModelB instances

Change History (7)

comment:1 Changed 19 months ago by dakinsloss@…

  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset
  • Resolution set to invalid
  • Status changed from new to closed

My mistake--this should not have been submitted, was still debugging and this is not an issue.

comment:2 Changed 11 months ago by mbhagya@…

Sorry but what happened to this bug? Is this fixed in a later version? Because I can still see this in 1.5.

comment:3 Changed 3 months ago by Microserf

Could I ask for additional clarifications regarding why this issue was closed and set to invalid? This seems like a legitimate use case to support, no?

comment:4 Changed 3 months ago by carljm

  • Resolution invalid deleted
  • Status changed from closed to new
  • Triage Stage changed from Unreviewed to Accepted

Looks like the original reporter closed it without much explanation. I'm reopening, because I agree this is a valid case and should be supported somehow (I think probably by accepting raw IDs for an FK field in update).

comment:5 Changed 13 days ago by vaskalas

  • Owner changed from nobody to vaskalas
  • Status changed from new to assigned

comment:6 Changed 12 days ago by vaskalas

  • Resolution set to fixed
  • Status changed from assigned to closed

Issue was fixed in commit c21e86ab9e3e5ebd6d245d038cb0cb352cd84c3a. Added unit tests to verify fix in https://github.com/django/django/pull/4499

comment:7 Changed 12 days ago by vaskalas

The unit test was added actually added in this commit, https://github.com/django/django/commit/e01b5a5823fa06a63382f87472978a16c77048d2

Note: See TracTickets for help on using tickets.
Back to Top