My idea was to fix this in a very straight way - change ForeignKey
behavior (the piece of code that generates many_set method) - so it
doesn't take into account null.

Let me explain a bit more. If foreign key is null - then there's no
link between Many and One object. So it many_set should return empty
set disregarding DB state.

Using object state (saved/not saved) makes this thing much more
complicated and have unpredicted not covered areas. If user changed
object PK and didn't save that into DB - that's his decision, we
should not keep the state.

Another edge case is null PK (user used custom field as PK) - that is
simply covered by initial code, but not by object state.

On 16 дек, 17:47, Luke Plant <l.plant...@cantab.net> wrote:
> On Thu, 2010-12-16 at 10:56 +0100, Roald de Vries wrote:
> > Now if I do:
>
> >      one = One()
>
> > ... then:
>
> >      one.many_set.all()
>
> > ... returns all Many's with 'self.one_id == None'.
>
> >  From an implementational (SQL) standpoint, this seems logical, but  
> > from an OO standpoint, it surely doesn't. I would expect an empty  
> > queryset as a result, or maybe even some exception. Is the current  
> > behavior a (conscious) choice/feature, or a bug?
>
> This is related tohttp://code.djangoproject.com/ticket/14615- see
> Gabriel's comments.
>
> It is basically a mistake to attempt to do 'one.many_set.all()' when
> 'one' hasn't been saved. We should either leave it as it is (it is the
> developers fault), or raise an exception.
>
> For the latter, I think we should use instance._state.adding to reliably
> detect whether a PK has been set or not. This could cause some
> incompatibilities: in the unusual case of creating an object, setting a
> primary key manually to some value that you know to be in the database,
> not saving the object, and then using the object to do queries, you will
> get exceptions where you didn't before. I think we can regard that
> workflow as broken, because:
>
> 1) there are other places where using model instances in similar ways
>    will currently break - the places where we rely on
>    instance._state.adding to be correct.
>
> 2) there are more obvious ways to do queries.
>
> 3) the current behaviour is inconsistent with ManyToMany fields -
>    they already do the checks that ForeignKey lookups are not doing.
>
> There is in fact one test in the test suite that breaks if we change
> this - it does Poll().choice_set.all() and expects an empty set. The
> reason it does this is to implicitly test null queries, but that sounds
> like a broken test to me (testing implicit behaviour rather than
> explicit).
>
> I've made a patch and attached to the ticket. It required one fix to the
> existing tests in the test suite (in the null_queries tests), the rest
> are additions.
>
> While I was there,  I fixed _get_next_or_previous_by_FIELD to use
> self._state.adding, rather than 'not self.pk', for the similar check
> that it does. I also fixed OneToOne fields, and updated ManyToMany
> lookups to check _state.adding rather than check the PK field.
>
> If people agree that the existing behaviour is a bug and that workflows
> that rely on it are broken, I'll go ahead and commit. Russell closed the
> bug as WONTFIX, but I think based on a misunderstanding (I misunderstood
> the original report in the same way).
>
> Luke
>
> --
> "Outside of a dog, a book is a man's best friend... inside of a
> dog, it's too dark to read."
>
> Luke Plant ||http://lukeplant.me.uk/

-- 
You received this message because you are subscribed to the Google Groups 
"Django developers" group.
To post to this group, send email to django-develop...@googlegroups.com.
To unsubscribe from this group, send email to 
django-developers+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/django-developers?hl=en.

Reply via email to