Opened 6 years ago

Closed 6 years ago

#29764 closed New feature (wontfix)

Allow using QuerySet.in_bulk() with a composed unique field

Reported by: Jean-Daniel Owned by: nobody
Component: Database layer (models, ORM) Version: 2.1
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

For instance, I have a model 'Data' with an unique_together constraint on (foo, bar) fields.

I would like to use in_bulk() on a query like:

  Data.objects.filter(foo='a').in_bulk(<list of bar values>, field_name='bar').

Obviously, the fact that bar is not unique should not be an issue to run the query, but Django performs a check to make sure the queried field is unique and raise an error if not.

As it may not be simple to check for all cases where field_name would result in a unique constraint, maybe it should be possible to disable this check (using an optional parameter).

Change History (4)

comment:1 by Tim Graham, 6 years ago

In your example, if bar isn't unique, then values may be overwritten in the in_bulk() return value unless the keys become ('foo', 'bar') (but how would in_bulk() know that?). I think this proposal would complicate in_bulk() a bit too much.

in reply to:  1 comment:2 by Jean-Daniel, 6 years ago

Replying to Tim Graham:

In your example, if bar isn't unique, then values may be overwritten in the in_bulk() return value unless the keys become ('foo', 'bar') (but how would in_bulk() know that?). I think this proposal would complicate in_bulk() a bit too much.

In my example, bar is guarantee to be unique, as the query already contains an equality filter on foo. And yes, I understand it would make the function too complex to try to handle all possibles cases, that's why I suggested to let the caller choose to disable the check, ie something like this:

in_bulk(<list of bar>, field_name='bar', disable_unique_check=True)

comment:3 by Simon Charette, 6 years ago

Given in_bulk can be easily replaced with a dict literal I don't think it's worth complexifying it more for the rare cases where this is useful either.

bulk_data = {
    data.bar: data for data Data.objects.filter(foo='a', bar__in=bars)
}
Last edited 6 years ago by Simon Charette (previous) (diff)

comment:4 by Tim Graham, 6 years ago

Resolution: wontfix
Status: newclosed
Summary: in_bulk does not works with composed unique fieldAllow using QuerySet.in_bulk() with a composed unique field
Type: BugNew feature
Note: See TracTickets for help on using tickets.
Back to Top