2012-05-09 15 views
0

私はアプリで関数に非常に多くの引数を渡すのを避ける方法を見つけようとしています。私はテーブルごとに異なるデータベースを使用しているので、参加することはできません。したがって、後続の関数に必要なオブジェクトを持つ主キー辞書を作成する必要があります。これを行うのは2つのクエリだけです。Django - 異なるファイルの異なる関数からアクセス/操作できるグローバル変数を作成できますか?

私の例は以下の通りです。 people_ref参照辞書を各変形関数に渡す必要があることに注意してください。私がやりたいことはどこからでもアクセスできる何らかのグローバルなpeople_ref変数を設定することです。そうすれば、People.in_bulk()レスポンスをグローバルプールにダンプするだけで、参照を渡すことなく、変形関数の内部から直接アクセスすることができます。それを行う方法はありますか?

def deform_edition(book_list, people_ref): 
    for book in book_list: 
     author = people_ref[book.author_id] #Change to global lookup? 
     b.last_edition = author.born 
    return book_list 

def deform_author(book_list, people_ref): 
    for book in book_list: 
     editor = people_ref[book.editor_id] #Change to global lookup? 
     b.author = editor 
    return book_list 

私がしようとするだろう:mayapp/utilsの/ deform.pyから

import itertools 
from django.db import models 
from myapp.utils import deform 

class People(models.Model): 
    born = model.DateField() 

class Book(models.Model): 
    author = models.ForeignKey(People, related_name='author_set') 
    editor = models.ForeignKey(People, related_name='editor_set') 
    last_edition = model.DateField() 

def make_crazy_books(book_ids): 
    book_list = Book.objects.using("db1").filter(id__in=book_ids) #Query here, db1 

    people_list = ((b.author_id, b.editor_id) for b in book_list) 
    people_ids = set(itertools.chain(*people_list)) 
    people_ref = People.objects.using("db2").in_bulk(people_ids) #Query here, db2 

    #Would like to not have to send people_ref to each function 
    book_list = deform.deform_edition(book_list, people_ref) 
    book_list = deform.deform_author(book_list, people_ref) 
    """ ... do some other deforming functions """ 

    return book_list 

:myappに/ models.pyから

>>> myapp.models.make_crazy_books([1,2,3]) 

:私は呼びたい何

Djangoのキャッシング機能を使用していますが、複数のスレッドが実行されている場合、キャッシュされた参照ディクショナリは他のsimultによって読み書きできます不名誉な要求。

EDIT:おそらくlocal-memory cachingはスレッドセーフなので動作しますか?

+0

LocMemのキャッシュはスレッドセーフですが、パフォーマンスが低下します。ドキュメントは、本番環境にとってはいい選択ではないことを明確に示しています。グローバルは常に悪いアイデアです、私はそれをPython/Djangoの*機能*と見なし、その使用は避けています。 –

答えて

0

一般的に、関連する関数のグループ間でデータを共有するのは、OOPのためのものです。関数を(メソッドとして)含むクラスを定義し、特定のデータでクラスをインスタンス化します。

この場合、既にデータに関連付けられているクラスがありますが、それはPeopleオブジェクトのQuerySetです。したがって、deformメソッドを含むPeopleのカスタムQuerySetサブクラスを定義することができます。残念ながら、Djangoを使用するにはカスタムマネージャを定義し、get_query_setをオーバーライドしてQuerySetサブクラスを返す必要があります。

関連する問題