2017-01-09 5 views
0

現在、このコードは、すべてのループ反復で2〜4回データベース(Postgres)に送られているようです。最初にTypeを取得して(作成し)、Componentを取得(作成)します。より少ないデータベースのトリップでこれを行う方法はありますか?Djangoのループで複数のデータベースへの移動を避けるには?

models.py

class Component(models.Model): 
    long = models.TextField() 
    type = models.SmallForeignKey('Type', models.CASCADE) 


class Type(models.Model): 
    type = models.TextField(unique=True) 


class Point(models.Model): 
    components = models.ArrayField(models.IntegerField(), default=[]) 

    def save_components(self, geocode): 
     _components = [] 
     for c in geocode: 
      ct = Type.objects.get_or_create(type=c['types'][0]) 
      _components.append(Component.objects.get_or_create(long=c['long_name'], type=ct).pk) 
     self.components = _components 
     self.save() 

受信データ:

geocode = [ 
    { 
     "long_name" : "Luray", 
     "types" : [ "locality", "political" ] 
    }, 
    { 
     "long_name" : "Page County", 
     "types" : [ "administrative_area_level_2", "political" ] 
    }, 
    { 
     "long_name" : "Virginia", 
     "types" : [ "administrative_area_level_1", "political" ] 
    }, 
    { 
     "long_name" : "United States", 
     "types" : [ "country", "political" ] 
    } 
] 
+0

OK、 'ct'と 'component'はどこからも出てこない、彼らはデータベースからフェッチされます、あなたはどのようにデータベースにヒットして情報を得ることができますか? –

+0

@ShangWangそれはローカルでキャッシュすることは可能だろうと思いますが、それは問題ではありません。目標は、1または2になる可能性のある旅行の数を減らすことです。私は、すべての情報が最初の旅行が行われた時点で既に存在することを考えれば、可能であると考えます。 – dtgq

+1

なぜManyToManyFieldを使用するのではなく、主キーの配列を格納していますか? –

答えて

1

多くの時間、Djangoはまともな仕事キャッシュデータベースの結果を行います。あなたはより多くの制御を持っているしたい場合は、このような何かを行うことができます(あなたはあまりにも多くの種類を持っていないことを提供する)

 
class Point(models.Model): 
    components = models.ArrayField(models.IntegerField(), default=[]) 

    def save_components(self, geocode): 
     _components = [] 
     _types = {t.type: t for t in Type.objects.all()} 
     for c in geocode: 
      ct = _types.get(c['types'][0], None) 
      if not ct: 
       ct = Type.objects.create(type=c['types'][0]) 
      _components.append(Component.objects.get_or_create(long=c['long_name'], type=ct).pk) 
     self.components = _components 
     self.save() 

この既存のタイプのすべての時間を見て、あなたを保存する必要があります。また、get_or_create()の代わりにget()を使用してDoesNotExist例外をキャッチし、後で関数内で一括挿入を使用することもできます(doc link

関連する問題