0

Peewee ORMを使用したフラスコアプリケーションに次のモデルがあります。

class Course(db.Model):
    name = CharField()

class Activity(db.Model):
    course = ForeignKeyField(Course)
    name = CharField()

各コースが optgroup であり、各アクティビティが Jinja の opgroup 内のオプションである複数選択フィールドを生成したいと考えています。

次のようなものがあるとします。

  • コースⅠ
    • 活動Ⅰ
    • 活動Ⅱ
    • 活動Ⅲ
  • コースⅡ
    • 活動Ⅳ
    • 活動Ⅴ

つまり、アクティビティ I、II、および III の ForeignKeyField はコース I を指し、コース II の ForeignKeyField はアクティビティ IV および V を指します。

Flask アプリケーションに次のビューがあります。

@app.route("/activities")
@login_required
def activities():
    activities = Activity.select()
    return render_template("activities.html", 
    activities = activities)

私はこのようなものを取得したい:

<select>
            <optgroup label="Course I">
              <option>Activity I</option>
              <option>Activity II</option>
              <option>Activity III</option>
            </optgroup>
            <optgroup label="Course II">
              <option>Activity IV</option>
              <option>Activity V</option>
            </optgroup>
 </select>

これは、Jinja の optgroup 部分なしで簡単に取得できます。

<select>
{% for activity in activities %} 
<option value="{{activity.id}}">{{activity.name}}</option>
{% endfor %}
</select>

しかし、optgroup で Course.name フィールドを取得する方法がわかりません。次に、ForeignKeyField を持つアクティビティが、この optgroup 内のオプションでこのコースを指しています。私が思いつく唯一の解決策は、すべてのコースを for ループで実行し、その for ループ内に別の for ループを作成して、すべてのアクティビティを実行し、 activity.Course.name フィールドが course.name と一致する場合に新しいオプションを生成することです。 、しかし、各コースのすべてのアクティビティをループする必要があるため、これは非常に非効率的です.

この選択ボックスを生成する簡単で効率的な方法はありますか?

4

1 に答える 1

1

詳細についてはドキュメントを参照してください。ただし、Pewee はすぐに使用できる結合をサポートしています。

class Course(db.Model):
    name = CharField()

class Activity(db.Model):
    # Note that we have added a backreference
    # to activities on the `Course` model with
    # the `related_name` argument
    # so we can do course.activites
    course = ForeignKeyField(Course, related_name='activities')
    name = CharField()

results = Course.select(Course, Activity).join(Activity)
# results is now a collection of courses, each course
# with all of its activities and it all should have been
# pulled out with one SQL query

次に、Jinja テンプレートで次のことを簡単に実行できます。

<select name="activities">
{% for course in courses %} 
 <optgroup label="course.name">
    {% for activity in course.activities %} 
    <option value="{{activity.id}}">{{activity.name}}</option>
    {% endfor %}
</optgroup>
{% endfor %}
</select>
于 2013-12-15T02:31:42.333 に答える