Are there some other solution of it ?

The more than 2000 queries is from the get_latest_text() function, it
will be generate one query each plan. I have more than 2000 plans so
it will generate more than 2000 queries.

def get_latest_text(self):
        try:
            tptxt = PlanTexts.objects \
                    .filter(plan_id=self.plan_id) \
                    .order_by('-plan_text_version')[0]
            return tptxt
        except:
             return None

The most important thing is there are a lot of plans with the same
plan_id but different plan_text_version in table plan_texts. It's
really difficult to model it.

I known QuerySet have a extra function but it looks only used for get
something's count or other thing not important.

http://docs.djangoproject.com/en/dev/ref/models/querysets/#extra-select-none-where-none-params-none-tables-none-order-by-none-select-params-none



On Mar 9, 6:21 pm, Malcolm Tredinnick <malc...@pointy-stick.com>
wrote:
> On Mon, 2009-03-09 at 02:47 -0700, K*K wrote:
> > I'm porting a old system to Django architecture. The database schema
> > can not be modified because the data was existed. The new system will
> > running with the old system at the beginning but will run standalone
> > in the future.
>
> > The system have two tables, which one is plan and another is
> > plan_text, plan_text contain two fields with plan_id and
> > plan_text_version, plan_id is a ForeignKey pointed to table plan,
> > plan_text_version is IntegerField. After editing the plan text it will
> > generate a new record with the plan_id and the last plan_text_version
> > + 1.
>
> > So when to show to plan and plan texts should show plan info first and
> > then compare plan_texts's plan_id with plan's plan_id and the max of
> > plan_texts_versions. It's easy to implement with SQL sub query
> > function.
>
> > But I got a big performance issue in the database modeling. The
> > requirements need to show the plan info and plan text in the same
> > time.
>
> > My temporary solution is made a get_latest_text() function in the
> > model file but when the user open the plans page it will generate more
> > than the count of plans.
>
> > The code is following:
>
> > # models.py
>
> > class Plans(models.Model):
> >     plan_id = models.AutoField(max_length=11, primary_key=True)
> >     name = models.CharField(max_length=255)
> >     create_date = models.DateTimeField(auto_now_add=True)
> >     author = models.ForeignKey(Accounts)
>
> >     class Meta:
> >         db_table = u'plans'
>
> >     def get_latest_text(self):
> >         try:
> >             tptxt = PlanTexts.objects \
> >                     .filter(plan_id=self.plan_id) \
> >                     .order_by('-plan_text_version')[0]
> >             return tptxt
> >         except:
> >              return None
>
> > class PlanTexts(models.Model):
> >     plan = models.ForeignKey(Plans, primary_key=True)
> >     plan_text_version = models.IntegerField(max_length=11,
> > db_index=True) # also a primary key; Django can't cope with this
> >     editor = models.ForeignKey(Accounts, db_column='who')
> >     modify_date = models.DateTimeField(auto_now_add=True)
> >     plan_text = models.TextField(blank=True)
>
> >     class Meta:
> >         db_table = u'plan_texts'
>
> > # End of models.py
>
> > It looks OK when the database server and web server in the same
> > machine, but really slow when the web server to call a remote database
> > server because the plans is more than 2000, so it generate more than
> > 2000 database queries calls.
>
> I don't see that this is going to be solved by multi-column primary keys
> (you cannot have *multiple* primary keys on a database table, but a
> primary key can span multiple columns). Django 1.1 won't support
> multi-column keys, however.
>
> Where are the 2000 queries coming from? Is this only retrieval? Why
> can't you retrieve all the records at once? If it's an update, why do
> all 2000 records need to be updated?
>
> Regards,
> Malcolm
--~--~---------~--~----~------------~-------~--~----~
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 
django-users+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/django-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to