Django - 我可以创建一个可以从不同文件中的不同函数访问/操作的全局变量吗?

时间:2012-05-09 17:10:51

标签: django global-variables argument-passing

我正在试图找出一种方法可以避免在我的应用程序中向函数传递这么多参数。我正在为每个表使用不同的数据库,因此无法加入,因此我需要创建一个主键字典,其中包含后续函数所需的对象。我这样做只做两个查询。

我的例子如下。请注意我必须将people_ref参考字典传递给每个变形函数。我想要做的是设置某种可以从任何地方访问的全局people_ref变量。这样我就可以将People.in_bulk()响应转储到全局池,然后直接从deform函数内部访问它,而不必传入引用。有没有办法做到这一点?

我想叫什么:

>>> 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的缓存功能,但是在运行多个线程的情况下,缓存的引用字典可以被其他同时请求读取/覆盖。

编辑:也许local-memory caching可以正常工作,因为它是线程安全的吗?

1 个答案:

答案 0 :(得分:0)

通常,在一组相关函数之间共享数据是OOP的用途 - 定义包含函数的类(作为方法),然后使用特定数据实例化类。

在这种情况下,虽然有一个类已经与数据相关联 - 但它是People对象的QuerySet。因此,您可以为包含deform方法的People定义自定义QuerySet子类 - 不幸的是,在Django中,为了使其工作,您还需要定义自定义管理器,覆盖get_query_set以返回您的QuerySet子类。 / p>