Opened 6 months ago

Closed 6 months ago

#35110 closed New feature (wontfix)

in_bulk does not work with annotated fields, nor on foreign key

Reported by: Cody Towstik Owned by: nobody
Component: Database layer (models, ORM) Version: dev
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 (last modified by Cody Towstik)

in_bulk does some checks about the fields on the model using the class _meta.
It does not consider that fields can be annotated, or exist on another related model.

However, the code that does all the processing seems like it could handle both cases.

In both cases, you can make the field distinct.

class Person(models.Model):
    email = models.CharField()

class Customer(models.Model):
    person = models.ForeignKey("Person")

emails_to_process = [ "a", "b", "c" ]

# annotate case
Customer.objects.annotate(
    email_lower=Lower("person__email")
).distinct(
    "email_lower"
).in_bulk(
    emails_to_process, fieldname="email_lower"
)

# foreign key case
Customer.objects.distinct("person__email").in_bulk(emails_to_process, fieldname="person__email)

Change History (2)

comment:1 by Cody Towstik, 6 months ago

Description: modified (diff)

comment:2 by Natalia Bidart, 6 months ago

Resolution: wontfix
Status: newclosed
Type: BugNew feature
Version: 5.0dev

Hello Cody, thank you for your ticket. This seems to be a new feature request since the documentation says that in_bulk works with a unique field or a distinct field (I read this as model's own fields, not annotations nor related field's fields, since checking uniqueness there could get tricky/expensive).

For cases like this, the recommended path forward is to first propose and discuss the idea/request with the community and gain consensus. To do that, you could start a new conversation on the Django Forum, where you'll reach a wider audience and likely get extra feedback.

I'll close the ticket for now, but if there is a community agreement for the feature request, you are welcome to come back to the ticket and point to the forum topic, so we can then re-open it. For more details, please see the documented guidelines for requesting features.

Thanks!

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