﻿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
19580	Unify reverse foreign key and m2m unsaved model querying	Anssi Kääriäinen	raydeal	"Currently when querying unsaved reverse relations the behavior differs.

Using model:
{{{
class Foo(models.Model):
    fk = models.ForeignKey('self', related_name='fk_rev')
    m2m = models.ManyToManyField('self')
}}}
and test case:
{{{
print(Foo().fk_rev.all())
print(Foo().m2m.all())
}}}

We get [] from the first filter, but an error
{{{
ValueError: ""<Foo: Foo object>"" needs to have a value for field ""from_foo"" before this many-to-many relationship can be used.
}}}
from the second filter.

So, m2m fields can't be filtered if the object isn't saved, but reverse fk fields can be filtered.

There is a (slightly stale) patch for #17541 which makes fk fields and m2m fields work consistently. The changes in behavior are:
{{{
* Nullable many-to-many and foreign key relations will return an empty
  queryset when the relation field is null. For many-to-many this was
  previously an error (no change for foreign keys).

* Trying to add objects to a foreign key relation when the relation field
  is null is now an error (no change for m2m).

* Trying to use a relation of any kind when the object isn't saved is now
  an error (no change for m2m).
}}}

I think we can squeeze these changes in as bug-fixes. These are slight backwards compatibility changes, but to me it seems that almost always the changes will be visible only in code that isn't working as intended. If these are seen as something likely breaking working code, then I don't see any way to make the APIs consistent.

The #17541 patch is available from: https://github.com/akaariai/django/compare/ticket_17541"	Cleanup/optimization	closed	Database layer (models, ORM)	dev	Normal	fixed		olivier.tabone@… Matt Westcott	Ready for checkin	1	0	0	0	1	0
