使用 Google App Engine 的 Django 模板从实体列表中访问具有特定 ReferenceProperty 值的实体

Posted

技术标签:

【中文标题】使用 Google App Engine 的 Django 模板从实体列表中访问具有特定 ReferenceProperty 值的实体【英文标题】:Using Django templates for Google App Engine to access an entity with specific ReferenceProperty value from a list of entities 【发布时间】:2012-01-05 07:30:24 【问题描述】:

我一直在努力解决 Google App Engine 和 Django 中的问题,但无法找到解决方案 (despitefindingsimilarproblems)。

让我稍微设置一下场景。我有以下三个实体:

Contributor:
    user = db.UserProperty()

Question:
    contributor = db.ReferenceProperty(Contributor, collection_name='questions')
    text = db.TextProperty()

Rating:
    contributor = db.ReferenceProperty(Contributor, collection_name='question_ratings')
    question = db.ReferenceProperty(Question, collection_name='ratings')
    rating = db.IntegerProperty(choices=set([1,2,3,4,5]))

在我的 Django 模板(如下)中,我的一般要求是显示 (1) 每个问题,(2) 问题的贡献者,以及 (3) 问题是否已被当前用户评分。

我的问题在于第三个要求。我无法弄清楚如何确定Question 是否具有与当前@ 关联的ContributorRating 987654329@(即Contributor 和用户属性users.get_current_user())。我怎么能做到这一点?

如果存在这样的Rating 实体,则会显示类似于“您已对该问题进行评分”的消息。否则,如果不存在这样的Rating,则会显示对问题进行评分的选项。这是我针对前两个要求的 Django 模板(以及概述第三个要求的注释)。

% for question in questions %
    <h1> question.text </h1>
    <h2> question.contributor.user.nickname() </h2>

    % comment %
    if no Rating exists for Question and Contributor:
        <h3>Rating: 1 2 3 4 5</h3>
    else:
        <h3>You have already rated this question.</h3>
    % endcomment %
% endfor %

这是 Google App Engine 的 Python 处理程序脚本:

questions = Question.all()

ratings = Rating.all()
ratings.filter('contributor = ', profile)

template_values = 
    'contributor': contributor,
    'questions': questions


path = os.path.join(os.path.dirname(__file__), "questions.html")
rendered_text = template.render(path, template_values)
self.response.out.write(rendered_text)

【问题讨论】:

【参考方案1】:

最好的方法是在 Python 代码中进行处理,并将仅包含相关信息的 dicts 列表传递给 Django 模板。这也意味着您可以利用 reference property prefetching 之类的技巧来最大程度地减少您必须执行的 RPC 数量。

【讨论】:

谢谢。我曾考虑过使用这种方法,但我认为可能有更好的方法。这真的是最好的方法吗?您能否推荐一些资源来进一步解释这一点? @mokogobo 是的,这是最好的方法——你通常应该避免在你的模板代码中处理,尤其是任何导致 RPC 的东西。 Django 模板的明确结构使这变得困难,以阻止您这样做。我不知道有任何资源可以处理这个特定问题。

以上是关于使用 Google App Engine 的 Django 模板从实体列表中访问具有特定 ReferenceProperty 值的实体的主要内容,如果未能解决你的问题,请参考以下文章

使用 Google App Engine 签名的 Google Cloud Storage 网址

是否可以将 Google App Engine 与 Google Cloud *** 一起使用?

Google App Engine 通过内部网络与 Compute Engine 通信

在 Google App Engine 中使用 Cron 作业

使用 Google App Engine 发布订阅

使用 Google App Engine 和 Google Cloud SQL 扩展 WordPress