Malcolm,thanks very much.
i am a newbie for django, and i just finished one big site by reading
documents and getting help here. what i think now is to optimize it,
so i use cache,select_related and values.
you give me a whole picture of django queryset, i know the difference
now, thanks again!

On Feb 19, 12:19 am, Malcolm Tredinnick <[EMAIL PROTECTED]>
wrote:
> On Sun, 2008-02-17 at 22:22 -0800, [EMAIL PROTECTED] wrote:
> > i have 2 Models(for example):
> > one is Category, have 2 fields: title and slug, the other is Entry
> > with 4 fields: title, time,category(foreign key),content.
>
> > now i just want show entry title and category slug, so i use this
> > queryset:
> > e = Entry.objects.all().values('title','category')
> > the benefit is huge content will be omitted which can save database
> > traffic(i considered).
>
> > but now category.slug is none, how can i get related value of category
> > in this query?
> > (i changed to e =
> > Entry.objects.all().values('title','category').select_related(), the
> > result was same.)
>
> Asking for the values('category') on some level doesn't make sense,
> since category is a whole object, not a single value. In fact, Django
> will be returning you the value of the foreign key (an integer here).
>
> Firstly, this smells of premature optimisation. If you're not sure you
> need something, particularly if it doesn't work, don't use it until you
> are sure. Once a database has to select one column from a row in  a
> table it is close to zero extra effort to select the remaining columns:
> it has most likely already read them from disk, since it has to read in
> units of a whole disk block, which is a number of kilobytes. A general
> rule of thumb in database query optimisation is that pulling out the
> data (as opposed to filtering, sorting and grouping) is a negligible
> amount of time. If it isn't, your query is so simple it doesn't matter
> anyway. Of course, like all rules of thumb, it's a generalisation based
> on experience and there are plenty of exceptions. But it does mean
> "don't worry about what probably doesn't matter until it does matter".
>
> Values() queries are faster in Django in some cases, but it's not
> because of the database activity. It's because creating Python objects
> doesn't take zero time and Django adds some overhead as well. If you're
> working with 50,000 - 100,000 rows of data, the difference can be quite
> noticeable. If you're working with a few dozen rows, not so much. Still,
> that is the reason values() exists, so that if you do not just need some
> specific pieces of information, you can pull them back and we only need
> to create a dictionary, not a whole object instance and emit the
> signals, etc.
>
> Secondly, select-_elated() is only an optimisation. It will never change
> the result set you ultimately have access to (even if you don't use
> select_related(), you'll have access to the fields on category from a
> normal Entry model. It will just require an extra database query). If
> there is a difference between what you can do with and without a
> select_related() call, it's a bug (and, yes, there are cases on trunk
> like this; they're all bugs).
>
> Thirdly, ticket #5768 is open to one day add support for values()
> queries across relations. See the comments there for what is involved in
> implementing this.
>
> Regards,
> Malcolm
>
> --
> I just got lost in thought. It was unfamiliar 
> territory.http://www.pointy-stick.com/blog/- Hide quoted text -
>
> - Show quoted text -
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To post to this group, send email to django-users@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-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to