Re: Looking for discussion on #5535

2007-09-26 Thread James Bennett

On 9/26/07, David Cramer <[EMAIL PROTECTED]> wrote:
> The only way this can be done as of current is by saying
> "MYmodel(id=1)" which is a hack. This technically shouldn't be done as
> you're instantiating an object without a dataset. What happens when
> the shared memory select related patch were to go in? You'd now have
> an instance of a model thats completely empty, and would then be
> referenced in memory.

No, no, a thousand times no. Read any of my posts in this thread
before you start going off again about having to instantiate an
object.


-- 
"Bureaucrat Conrad, you are technically correct -- the best kind of correct."

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



Re: Looking for discussion on #5535

2007-09-26 Thread David Cramer

The only way this can be done as of current is by saying
"MYmodel(id=1)" which is a hack. This technically shouldn't be done as
you're instantiating an object without a dataset. What happens when
the shared memory select related patch were to go in? You'd now have
an instance of a model thats completely empty, and would then be
referenced in memory.

On Sep 24, 6:54 am, Michael Radziej <[EMAIL PROTECTED]> wrote:
> On Mon, Sep 24, James Bennett wrote:
> > As I see it, the existence of the "somefieldname_id" property is an
> > implementation detail of ForeignKey -- the data comes back as part of
> > the row we select, and we need to stick it somewhere.
>
> Ehm ... does this mean that this might change, or is this part of the stable
> API?
>
> Michael
>
> --
> noris network AG - Deutschherrnstraße 15-19 - D-90429 Nürnberg -
> Tel +49-911-9352-0 - Fax +49-911-9352-100http://www.noris.de- The 
> IT-Outsourcing Company
>
> Vorstand: Ingo Kraupa (Vorsitzender), Joachim Astel, Hansjochen Klenk -
> Vorsitzender des Aufsichtsrats: Stefan Schnabel - AG Nürnberg HRB 17689


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



Re: Looking for discussion on #5535

2007-09-25 Thread Simon Litchfield

Seems Collin, I and co will have to agree to disagree on this. It's
all relative I guess, you think we're upside down, I think you're
upside down :-) Just a shame to burn thousands of man hours on
something which is so plainly inconsistent to fresh eyes.


Collin Grady wrote:

> James Bennett said the following:
> > 1. It breaks consistency with how we currently do things
>
> I still disagree with you there. It would only break consistency if it
> was actually crossing the relation and checking the ID field of the
> other table.
>
> Since it is *not* a cross-relation lookup, not using __ syntax is *not*
> inconsistent. On the contrary, it now becomes *more* consistent with
> normal data access, such as obj.fkey_id
>
> > 2. What happens if somebody actually has a non-foreign-key field whose
> > name ends with the sequence "_id"?
>
> Then it finds that field as normal, and everything continues on. You'd
> only have to fallback to attname if you don't find a matching field name.
>
> --
> Collin Grady
>
> "Life is too important to take seriously."
>   -- Corky Siegel


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



Re: Looking for discussion on #5535

2007-09-24 Thread Collin Grady

James Bennett said the following:
> 1. It breaks consistency with how we currently do things

I still disagree with you there. It would only break consistency if it
was actually crossing the relation and checking the ID field of the
other table.

Since it is *not* a cross-relation lookup, not using __ syntax is *not*
inconsistent. On the contrary, it now becomes *more* consistent with
normal data access, such as obj.fkey_id

> 2. What happens if somebody actually has a non-foreign-key field whose
> name ends with the sequence "_id"?

Then it finds that field as normal, and everything continues on. You'd
only have to fallback to attname if you don't find a matching field name.

-- 
Collin Grady

"Life is too important to take seriously."
-- Corky Siegel

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



Re: Looking for discussion on #5535

2007-09-24 Thread Michael Radziej

On Mon, Sep 24, James Bennett wrote:

> As I see it, the existence of the "somefieldname_id" property is an
> implementation detail of ForeignKey -- the data comes back as part of
> the row we select, and we need to stick it somewhere.

Ehm ... does this mean that this might change, or is this part of the stable
API?

Michael

-- 
noris network AG - Deutschherrnstraße 15-19 - D-90429 Nürnberg -
Tel +49-911-9352-0 - Fax +49-911-9352-100
http://www.noris.de - The IT-Outsourcing Company
 
Vorstand: Ingo Kraupa (Vorsitzender), Joachim Astel, Hansjochen Klenk - 
Vorsitzender des Aufsichtsrats: Stefan Schnabel - AG Nürnberg HRB 17689

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



Re: Looking for discussion on #5535

2007-09-24 Thread James Bennett

On 9/24/07, Simon Litchfield <[EMAIL PROTECTED]> wrote:
> That's it, right there in a nutshell. Empty your head of Django for a
> second, have another look; do you not see the inconsistency there?

No :)

As I see it, the existence of the "somefieldname_id" property is an
implementation detail of ForeignKey -- the data comes back as part of
the row we select, and we need to stick it somewhere.

Now, consider the problems with the proposal to magically make this
work in the DB API:

1. It breaks consistency with how we currently do things: except for
the "pk" shortcut (which is well justified on its own), you can only
look up on things that are actual fields on the model, not by
arbitrary properties which happen to correspond to things in the
database, and if you want to do something based on a relation you use
the double-underscore syntax in all cases (regardless of whether we
can optimize joins out of the eventual query). This makes a consistent
API, which would break if we suddenly allow the "foreignkey_id" syntax
to work.

2. What happens if somebody actually has a non-foreign-key field whose
name ends with the sequence "_id"? There are plenty of use cases for
this, and then suddenly we've got a fine kettle of fish because we
have to start guessing about whether this is trying to reference a
local field or use magical foreign-key querying. And the possibilities
for name collisions would mean lots of nasty workarounds in model
class validation and more places where we might have to force people
to use explicit related_name.

> And perhaps more importantly, both of these .get* examples here
> generate an unnecessary join anyway.

No, they don't. The join is optimized away.

> Bottom line is, surely any ORM should allow you to perform a simple
> single table lookup based on *any* field in the given table?

Bottom line is *you can already do this*. You and David and Collin
aren't really saying "it's not possible to do this in Django", you're
saying "it's possible, we just don't like the syntax for it". Jacob's
proposal above -- making get_or_create() smart enough to figure out
that a join in the query should become a default value in creating the
instance -- seems like the right way to make get_or_create() easier to
use in this case, and once that happens I don't honestly see a reason
to break the DB API's consistency for sake of exposing an
implementation detail. In fact, at this point I'm leaning toward
submitting a patch to turn the damned thing into a private
double-underscore instance variable just so people can't get at it ;)


-- 
"Bureaucrat Conrad, you are technically correct -- the best kind of correct."

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



Re: Looking for discussion on #5535

2007-09-24 Thread Simon Litchfield

Gary Wilson wrote:

> This is a tricky way around django.db.models.base.Model.__init__'s current
> enforcement of the foreign key field (without the _id) wanting an instance,
> but shouldn't be needed if we implement the above (meaning create() would act
> like get() in that you could pass either an int, a str, or a model instance to
> the foreign key field).

Hmmm, I'd almost say this was the best solution; ie, losing the magic
fkname_id notation altogether in favour of making it consistent (in a
gradual phased manner of course!).

The only problem here though, we'd need to continue the trend, by
changing model.__set__ so that by setting instance.fkname = 47 it'd
lazy load instance.fkname as a proper model instance, rather than an
int (or str/date/time etc).

Great, but then how do I get the fkname_id int without having to hit
the database? Looks like we're straight back to the drawing board with
the magic fkname_id notation again!


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



Re: Looking for discussion on #5535

2007-09-24 Thread Simon Litchfield

James Bennett said the following:

> >>> my_id = 3
> >>> UserProfile.objects.create(user_id=my_id) #works
> >>> UserProfile.objects.get(user__id=my_id) # works
> >>> UserProfile.objects.get_or_create(user__id=my_id, defaults={'user_id': 
> >>> my_id }) #works

That's it, right there in a nutshell. Empty your head of Django for a
second, have another look; do you not see the inconsistency there?

Why confuse the issue? Foreign keys are always named fieldname_id by
default, regardless of the foreign table's primary key field name. So,
the argument about readability, and confusing foo_bar with foo__bar is
unfounded. It's always gonna be foo__bar for foreign key, and foo_bar
for the local field. Moreover, foo__id and foo_id are the same value
anyway.

And perhaps more importantly, both of these .get* examples here
generate an unnecessary join anyway.

Bottom line is, surely any ORM should allow you to perform a simple
single table lookup based on *any* field in the given table?


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



Re: Looking for discussion on #5535

2007-09-20 Thread Collin Grady

Gary Wilson said the following:
> I say you are looking at it backwards here.  It's not that get() and
> get_or_create() don't work with fkeyname_id, it's that Model() and create()
> don't work with fkeyname.

I disagree strongly with that. It's already established that
obj.fkeyname is the object, and obj.fkeyname_id is the ID, so why break
that?

It's far more consistent to just make fkeyname_id work in .get() and
.get_or_create(), in my opinion.

-- 
Collin Grady

Don't let your status become too quo!

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



Re: Looking for discussion on #5535

2007-09-19 Thread Gary Wilson

Collin Grady wrote:
> David Cramer said the following:
>> I don't believe .create() allows you to say myforeignkey=1, correct me
>> if I'm wrong, but I think it throws an error about it needing to be a
>>  instance.

Yes, you are correct.

> But .create() already works with fkeyname_id, it's just get() and
> get_or_create() that don't :)

I say you are looking at it backwards here.  It's not that get() and
get_or_create() don't work with fkeyname_id, it's that Model() and create()
don't work with fkeyname.

To take the examples in the ticket description:
==
MyModel.objects.create(author_id=1) # Works

but it shouldn't.  Instead, we should make the following allowed:
MyModel.objects.create(author=1)
MyModel.objects.create(author='1')
--
MyModel.objects.create(author=Author(id=1)) # Works

This is a tricky way around django.db.models.base.Model.__init__'s current
enforcement of the foreign key field (without the _id) wanting an instance,
but shouldn't be needed if we implement the above (meaning create() would act
like get() in that you could pass either an int, a str, or a model instance to
the foreign key field).
==
MyModel.objects.get(author_id=1) # Doesn't Work

as it shouldn't.
--
MyModel.objects.get(author=Author(id=1)) # Works

as it should, but sort of pointless since foreign key field in get() can
already take an int or str too.
--
MyModel.objects.get_or_create(author_id=1) # Doesn't Work

as it shouldn't.  But, the following should be made to work:
MyModel.objects.get_or_create(author=1)
MyModel.objects.get_or_create(author='1')
MyModel.objects.get_or_create(..., defaults={'author': 1})
MyModel.objects.get_or_create(..., defaults={'author': '1'})
And they would work if django.db.models.base.Model.__init__ is fixed as
mentioned above with create().
--

Gary

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



Re: Looking for discussion on #5535

2007-09-19 Thread Collin Grady

Jacob Kaplan-Moss said the following:
> That is, make::
> 
> Foo.objects.get_or_create(bar__id=1)
> 
> Work the same way as::
> 
> Foo.objects.get_or_create(bar__id=1, defaults={"bar_id": 1})

That would probably be better than the current, but I'm still on David's
side in thinking that allowing bar_id in get, create, and get_or_create
is far more consistent, since you can also use bar_id as a normal
attribute lookup and as a kwarg in making a model instance.

It just seems abnormal that it works everywhere /except/ .get() and
.get_or_create()

-- 
Collin Grady

  Live within your income, even if you have to borrow to do so.
-- Josh Billings

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



Re: Looking for discussion on #5535

2007-09-19 Thread Collin Grady

James Bennett said the following:
> 1. The lookup syntax *always* uses double underscores for relations.

But checking fkey_id isn't trying to cross the relation - it wants the
local value :)

> 2. The lookup syntax *only* lets you look up by things that actually are 
> fields.

*cough* .get(pk=1)

:)

-- 
Collin Grady

"MacDonald has the gift on compressing the largest amount of words into
the smallest amount of thoughts."
-- Winston Churchill

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



Re: Looking for discussion on #5535

2007-09-19 Thread Jacob Kaplan-Moss

On 9/19/07, Collin Grady <[EMAIL PROTECTED]> wrote:
> But .create() already works with fkeyname_id, it's just get() and
> get_or_create() that don't :)

So seems to me the best way to solve this is to make get_or_create()
understand how to swizzle a lookup of the form "fk__id" or "fk__pk"
into a create() arg of "fk_id".

That is, make::

Foo.objects.get_or_create(bar__id=1)

Work the same way as::

Foo.objects.get_or_create(bar__id=1, defaults={"bar_id": 1})

Have I got it right?

Jacob

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



Re: Looking for discussion on #5535

2007-09-19 Thread James Bennett

On 9/19/07, David Cramer <[EMAIL PROTECTED]> wrote:
> I don't believe .create() allows you to say myforeignkey=1, correct me
> if I'm wrong, but I think it throws an error about it needing to be a
>  instance.

OK, so let's do this exhaustively.

>>> my_id = 3
>>> UserProfile.objects.create(user_id=my_id) #works
>>> UserProfile.objects.get(user__id=my_id) # works
>>> UserProfile.objects.get_or_create(user__id=my_id, defaults={
'user_id': my_id }) #works

That covers get(), create() and get_or_create(). In none of these
cases did you need to have an instance of the related model available
in memory.

So: since your argument about "needing an instance" is unfounded,
what's to gain by breaking the consistency of the lookup syntax?

One more time to recap:

1. The lookup syntax *always* uses double underscores for relations.
2. The lookup syntax *only* lets you look up by things that actually are fields.

Your proposal would violate both of these points of consistency, by
breaking (1) to allow a single underscore and breaking (2) to allow
lookup by something that, rather than being a field, is an
implementation detail of the field.

What's the gain?


-- 
"Bureaucrat Conrad, you are technically correct -- the best kind of correct."

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



Re: Looking for discussion on #5535

2007-09-19 Thread Collin Grady

David Cramer said the following:
> I don't believe .create() allows you to say myforeignkey=1, correct me
> if I'm wrong, but I think it throws an error about it needing to be a
>  instance.

But .create() already works with fkeyname_id, it's just get() and
get_or_create() that don't :)

-- 
Collin Grady

BOFH excuse #150:

Arcserve crashed the server again.

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



Re: Looking for discussion on #5535

2007-09-19 Thread David Cramer

I don't believe .create() allows you to say myforeignkey=1, correct me
if I'm wrong, but I think it throws an error about it needing to be a
 instance.

On Sep 19, 11:30 am, "James Bennett" <[EMAIL PROTECTED]> wrote:
> On 9/19/07, David Cramer <[EMAIL PROTECTED]> wrote:
>
> > Yes, my biggest argument is I want to use .get_or_create() and I don't
> > have an instance of the row (the id) I'm trying to insert. I'm *not*
> > going to query for this instance (I'll write SQL before I add extra
> > queries just to do an update/insert), and I don't like creating a fake
> > temporary object, which will probably not work w/ the shared memory
> > patch. (e.g. mykey=Model(id=3))
>
> And it's been pointed out to you *twice* now that you don't have to
> have an instance to do this.
>
> --
> "Bureaucrat Conrad, you are technically correct -- the best kind of correct."


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



Re: Looking for discussion on #5535

2007-09-19 Thread Collin Grady

Tom Tobin said the following:
> *Way* -1.  I don't want to be looking at code and wondering whether a
> particular query is dealing with a local field named "foo_bar" or a
> related model "foo" with a field "bar".

Except when you do user__id it /is/ referring to the local column, it
just magically drops the join on you, even though it looks like it will
do one :)

-- 
Collin Grady

Save the whales.  Collect the whole set.

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



Re: Looking for discussion on #5535

2007-09-19 Thread James Bennett

On 9/19/07, David Cramer <[EMAIL PROTECTED]> wrote:
> Yes, my biggest argument is I want to use .get_or_create() and I don't
> have an instance of the row (the id) I'm trying to insert. I'm *not*
> going to query for this instance (I'll write SQL before I add extra
> queries just to do an update/insert), and I don't like creating a fake
> temporary object, which will probably not work w/ the shared memory
> patch. (e.g. mykey=Model(id=3))

And it's been pointed out to you *twice* now that you don't have to
have an instance to do this.


-- 
"Bureaucrat Conrad, you are technically correct -- the best kind of correct."

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



Re: Looking for discussion on #5535

2007-09-19 Thread David Cramer

Yes, my biggest argument is I want to use .get_or_create() and I don't
have an instance of the row (the id) I'm trying to insert. I'm *not*
going to query for this instance (I'll write SQL before I add extra
queries just to do an update/insert), and I don't like creating a fake
temporary object, which will probably not work w/ the shared memory
patch. (e.g. mykey=Model(id=3))

On Sep 19, 11:01 am, "Waylan Limberg" <[EMAIL PROTECTED]> wrote:
> The following are assumptions I would make if both "worked".
>
> > UserProfile.objects.get(user__id=3) #Currently works
>
> This is obviously a foreign key and clearly refers to the id field of
> the User model. Nuf' said.
>
> > UserProfile.objects.get(user_id=3) #Currently does not work
>
> There is no indication here as to whether this refers to a foreign key
> or not. Change the model to something other than User (which has a
> know convention) and I would assume this is referring to a user_id
> field of the UserProfile model. True, the foreign key is most likely
> stored in a user_id column in the db, but a quick glance at the above
> query provides no indication of that. It could just be a poorly named
> column with no relation to User. If it does, in fact, point to a
> foreign key, my assumption would be that a lighter/faster SQL
> statement would be generated avoiding the need to access the User
> table. More likely, the same SQL would be generated for either, so
> this is just misleading.
>
> So among the two above examples, leaving things alone is less
> confusing, as Marty Alchin points out.
>
> However, the ticket also seems to indicate that this works:
>
> UserProfile.objects.create(user_id=3)
>
> Which is not so consistent. I get the impression that this is the
> motivation for dcramer's argument. If is works for create, why not for
> get? Perhaps it shouldn't work for create either, although we probably
> don't want to go there for backwards compatibility issues.
>
> Just my $0.02
>
> --
> 
> Waylan Limberg
> [EMAIL PROTECTED]


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



Re: Looking for discussion on #5535

2007-09-19 Thread Waylan Limberg

The following are assumptions I would make if both "worked".

> UserProfile.objects.get(user__id=3) #Currently works

This is obviously a foreign key and clearly refers to the id field of
the User model. Nuf' said.

> UserProfile.objects.get(user_id=3) #Currently does not work

There is no indication here as to whether this refers to a foreign key
or not. Change the model to something other than User (which has a
know convention) and I would assume this is referring to a user_id
field of the UserProfile model. True, the foreign key is most likely
stored in a user_id column in the db, but a quick glance at the above
query provides no indication of that. It could just be a poorly named
column with no relation to User. If it does, in fact, point to a
foreign key, my assumption would be that a lighter/faster SQL
statement would be generated avoiding the need to access the User
table. More likely, the same SQL would be generated for either, so
this is just misleading.

So among the two above examples, leaving things alone is less
confusing, as Marty Alchin points out.

However, the ticket also seems to indicate that this works:

UserProfile.objects.create(user_id=3)

Which is not so consistent. I get the impression that this is the
motivation for dcramer's argument. If is works for create, why not for
get? Perhaps it shouldn't work for create either, although we probably
don't want to go there for backwards compatibility issues.

Just my $0.02

-- 

Waylan Limberg
[EMAIL PROTECTED]

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



Re: Looking for discussion on #5535

2007-09-19 Thread Michael Radziej

On Wed, Sep 19, James Bennett wrote:

> 
> David Cramer has asked that Django's ORM lookup syntax be changed to
> allow a single underscore for a foreign key lookup; in other words,
> the following two examples would become equivalent:
> 
> UserProfile.objects.get(user__id=3) #Currently works
> UserProfile.objects.get(user_id=3) #Currently does not work
> 
> Relevant ticket is #5535:
> 
> http://code.djangoproject.com/ticket/5535

It's not about the number of underscores. It becomes more clear if you have
a custom primary key, such as in:

Model Fitze(models.Base):
  eek=...(primary_key = True, ...)

Model Fatze(models.Base):
  fitze = ForeignKey(Fitze)

Here, it's to allow Fatze.objects.get(fitze_id=3) vs.
Fatze.objects.get(fitze__eek=3)

The latter looks like it did a join (though this is optimized away, isn't
it?)

For me, the point is that the following code is bad:

  fatze = models.Fatze.objects.get(id=1)   # whatever
  x = fatze.fitze.eek

It requires another database query, so it's better to write:

  x = fatze.fitze_id

Thus, I often also try to use this in get(), which doesn't work, as David
noticed.


Another point is, I don't really understand what ubernostrum proposes in the
ticket to replace

   Fatze.objects.get_or_create(fitze_id=3)

Do you really want to resort to this?

   Fatze.objects.get_or_create(fitze__id=3, defaults = {'fitze': 3})

(And I rather think this does not even work.)



Michael

-- 
noris network AG - Deutschherrnstraße 15-19 - D-90429 Nürnberg -
Tel +49-911-9352-0 - Fax +49-911-9352-100
http://www.noris.de - The IT-Outsourcing Company
 
Vorstand: Ingo Kraupa (Vorsitzender), Joachim Astel, Hansjochen Klenk - 
Vorsitzender des Aufsichtsrats: Stefan Schnabel - AG Nürnberg HRB 17689

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



Re: Looking for discussion on #5535

2007-09-19 Thread Tom Tobin

On 9/19/07, James Bennett <[EMAIL PROTECTED]> wrote:
>
> David Cramer has asked that Django's ORM lookup syntax be changed to
> allow a single underscore for a foreign key lookup; in other words,
> the following two examples would become equivalent:
>
> UserProfile.objects.get(user__id=3) #Currently works
> UserProfile.objects.get(user_id=3) #Currently does not work
>
> Relevant ticket is #5535:
>
> http://code.djangoproject.com/ticket/5535

*Way* -1.  I don't want to be looking at code and wondering whether a
particular query is dealing with a local field named "foo_bar" or a
related model "foo" with a field "bar".

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



Re: Looking for discussion on #5535

2007-09-19 Thread Marty Alchin

On 9/19/07, James Bennett <[EMAIL PROTECTED]> wrote:
> David Cramer has asked that Django's ORM lookup syntax be changed to
> allow a single underscore for a foreign key lookup; in other words,
> the following two examples would become equivalent:
>
> UserProfile.objects.get(user__id=3) #Currently works
> UserProfile.objects.get(user_id=3) #Currently does not work

I second the notion of continuing to obscure the magical fields in
general usage. Wherever reasonable, models should look and act exactly
as they're defined in their classes. Drawing further attention to the
fact that there are in fact "invisible" attributes will just cause
more confusion, I would think.

Anyway, I'm no expert on the matter, but that's my take on it.

-Gul

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