0

アプリの関数に非常に多くの引数を渡さないようにする方法を見つけようとしています。テーブルごとに異なるデータベースを使用しているため、結合ができないため、後続の関数に必要なオブジェクトを含む主キー ディクショナリを作成する必要があります。これを行うのは、クエリを 2 つだけ作成するためです。

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

私が呼びたいもの:

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

myapp/models.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

mayapp/utils/deform.py から:

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

Django のキャッシュ機能を使用してみますが、複数のスレッドが実行されていると、キャッシュされた参照ディクショナリが他の同時要求によって読み取られたり上書きされたりする可能性があります。

編集:スレッドセーフなので、おそらくローカルメモリキャッシングが機能するでしょうか?

4

1 に答える 1

0

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

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

于 2012-05-09T19:11:31.253 に答える