Code

Opened 3 years ago

Closed 7 months ago

#16609 closed Bug (fixed)

Admin searches produce duplicate results if search_fields contains M2M traversals

Reported by: cheater00@… Owned by: nobody
Component: contrib.admin Version: master
Severity: Normal Keywords: search_fields m2m duplicate duplicates
Cc: cheater00@…, CodenameTim Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by aaugustin)

I believe this has already been touched upon in #15819, however the consensus (comment ticket:15819#comment:13) was

"For people in situations where .distinct() is broken for whatever reason, the workaround here is simple: don't use search_fields with relations in a way that triggers it."

I couldn't find a ticket for this, so here it is.

In my case, I am searching for a keyword which is found in a search_fields item that isn't traversing M2M. When search_fields also contains a M2M traversal, I get duplicate results.

In my case - this might be relevant or not - I am traversing a ForeignKey first and then an M2M field in that problematic search_fields entry, e.g:

search_fields = ['=id', '=fkmodel__m2mmodel__name']

This happens even though the string is not matched by fkmodel__m2mmodel__name, only by id.

This might not be clear, this is what the model relations look like:

(Model SearchedModel) --ForeignKey--> (Model FKModel) --ManyToMany--> (Model M2MModel)

M2MModel contains the name field that I have specified in search_fields.

This might or might not be related to #15559.

I have tested this against 1.3, yesterday's 1.3.X, and yesterday's dev and it is broken in all of them. (today is 10 Aug 2011)

Attachments (0)

Change History (9)

comment:1 Changed 3 years ago by cheater <cheater00@…>

  • Cc cheater00@… added
  • Needs documentation unset
  • Needs tests unset
  • Patch needs improvement unset

comment:2 Changed 3 years ago by cheater <cheater00@…>

Sorry about not using code blocks above - only noticed the error after submitting the ticket. The search_fields should look like this:

search_fields = ['=id', '=fkmodel__m2mmodel__name'] 

comment:3 Changed 3 years ago by aaugustin

  • Description modified (diff)

Fixed formatting.

comment:4 Changed 3 years ago by aaugustin

  • Description modified (diff)

comment:5 Changed 3 years ago by aaugustin

  • Triage Stage changed from Unreviewed to Accepted

It's likely that this is an ORM bug, but since the symptoms show in the admin, I'll leave it like this until we have more information.

comment:6 Changed 3 years ago by cheater <cheater00@…>

For one thing, the admin actions also get doubled items. In fact, it is so that this could lead to fairly serious data loss and other errors. Imagine an admin action which bills users for something - they get found twice - and they get billed twice! I think this warrants bumping up the importance. I have also stumbled upon this when I was writing a money-related summary which counted the amount of items in stock, and summarized them, also calculating the prices. The prices were way off, of course. I have done a workaround wich skips objects that have already been seen by tracking the ID, but some other people might not be so lucky as to notice the problem before it's too late.

comment:7 Changed 12 months ago by andreas@…

Has this bug been fixed in later versions of django? Still broken in 1.3.

comment:8 Changed 7 months ago by CodenameTim

  • Cc CodenameTim added

This bug has been fixed by at least 1.3.7 and it's fixed in master.

comment:9 Changed 7 months ago by timo

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

Add Comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
as The resolution will be set. Next status will be 'closed'
The resolution will be deleted. Next status will be 'new'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.