﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
33276	Strange difference for prefetched_objects between related_field.remove, m2m_related_field.remove and generic_related_field.remove.	Maxim Danilov	nobody	"Hello.

i want to call _remove_prefetched_objects only to remove cached old data. But i dont want to use private method.

instance.m2m_related_field.remove() - made what i want.

instance.generic_related_field.remove() - Does nothing
instance.related_field.remove() - Does nothing

in django (> 3.2) code i see:

{{{
# (django.db.models.fields.related_descriptors 964-965)
# m2m_related_field
def remove(self, *objs):
    self._remove_prefetched_objects()
    ...


# (django.contrib.contenttypes.fields 635-645)
# generic_related_field
def remove(self, *objs, bulk=True):
    if not objs:
        return
    ...
    return self._clear(...)

def _clear(...):
    self._remove_prefetched_objects()


# (django.db.models.fields.related_descriptors 694-719)
# related_field
def remove(self, *objs, bulk=True):
    if not objs:
        return
    ....
    return self_clear(...)

def _clear(...):
    self._remove_prefetched_objects()
}}}

i think, It is better to made the same functionality in remove method for all related fields.

{{{
# for all related fields:
def remove(self, *objs):
    self._remove_prefetched_objects()
    if objs:
        return self._do_something_to_remove(....)
}}}

This made a removal interface more standard. "	Cleanup/optimization	closed	Database layer (models, ORM)	3.2	Normal	wontfix	prefetch_related		Unreviewed	0	0	0	0	1	0
