2012-02-28 9 views
0

私たちのページの1つは、苦労して遅いです。なぜなら、私たちは1つのことに関して同様のことをつかんでいるからです。モデルは、互いに異なって見えるが、すべては、このコンテナに関連:現在のタイプを参照している複数のモデルを効率的に取得するにはどうすればよいですか?

class Container(models.Model): 
    title = models.CharField(max_length=100) 

    def get_stuff(): 
     things = list(MyItem.objects.filter(
      belongs_in=self, deleted = False)) 
     things.extend(AnotherItem.objects.filter(
      belongs_in=self, deleted = False)) 
     things.extend(ZomgItem.objects.filter(
      belongs_in=self, deleted = False)) 

     return things 

実際のユースケースもちろんのも、メシエ:このようなコンテナで

class MyItem(models.Model): 
    deleted = models.BooleanField(default=False) 
    whitelabel = models.BooleanField(default=False) 
    belongs_in = models.ForeignKey(Container) 

class AnotherItem(models.Model): 
    deleted = models.BooleanField(default=False) 
    belongs_in = models.ForeignKey(Container) 
    starts = models.DateTimeField(default=datetime.utcnow()) 

class ZomgItem(models.Model): 
    deleted = models.BooleanField(default=False) 
    belongs_in = models.ForeignKey(Container) 
    title = models.CharField(max_length=100) 

。これを痛々しく遅くするのをやめさせるにはどうすればいいですか?

+0

リストを拡張する代わりに 'itertools.chain'を使うことができますが、私はそれがあなたに目立つスピードアップを与えるとは思わないでしょう。 4 dbクエリ。したがって、(これがあなたのボトルネックであると確信しているなら)キャッシングやDBスキーマの変更といった他の最適化を使用するべきです。 – DrTyrsa

+0

ページ内でget_stuffを何度も呼び出しますか?削除されたモデルインスタンスを別のモデルクラスに移動することはできませんか?例:DeletedZomgItem(ZomgItem):deleted = models.BooleanField(デフォルト= True)? – Sammyrulez

+0

@Sammyrulez主に私がモデルについてのクエリを実行していることを示していました。 'AnotherItem.objects.filter(created__lt = datetime.utcnow())'をチェックすることができるように、私はむしろモデルが入るすべての状態に対して1つのモデルを作成しません。 –

答えて

0

「get_stuff」の結果をどのように呼び出したのかを言うと役立ちます。たぶんそれはより適切なクエリを作成するだけの問題です...

関連する問題