2017-02-26 11 views
1

ローカルハイキングをカタログするサイトがあり、ユーザーはハイキング中であることを記録できます。私はハイキングを含む検索ページを持っています。私が表示しようとしているフィールドの1つは、ハイキング中のすべての人々のリストです。私はこれをハイキングの個々の詳細ページ内で把握しましたが、検索ページにこの情報を表示するために、ハイキングを印刷しているクエリーセット内に新しいクエリーセットを作成する方法を理解することはできません。ここでテンプレート内の外部キー関連インスタンスの一覧表示(クエリセット内のクエリセット)

は、いくつかのコードです:

models.py:

class Hike(models.Model): 
    name = models.CharField(max_length=255, unique=True) 
    slug = models.SlugField(unique=True) 
    ... 

class UserLog(models.Model): 
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    hike = models.ForeignKey(Hike, on_delete=models.CASCADE) 

はviews.py:

def hike_list(request): 
    qs = Hike.objects.all() 
    ... some other filters here 
?-->users = UserLog.objects.filter(id=qs.id) 

テンプレート:

{% for qs in qs %} 
{{ hike.name }}{{ hike.other_details_and_stuff }} 
?----> {% for users in hikes %}{{ user.name }}{% endfor %} 
{% endfor %} 

ここで個体内作業コードですハイキングの詳細ページ:

views.py:

def hike_detail (request, slug) 
    users = UserLog.objects.filter(hike__slug=slug) 

私はその上でクエリセットを実行し、クエリセット内の個々の項目からスラグを呼ぶにはどうすればよいですか?

+0

「climb」または「slug」フィールドは表示されません。ですから、 'qs'クエリのハイキングに関連するすべてのユーザを設定したいのですか? – schwobaseggl

+0

Woops、申し訳ありません。それは登りではなく、登りであるはずです。私はオリジナルを編集します。しかし、はい、私はその特定のハイキングに関連付けられているすべてのユーザーをqsクエリーセットに入れたいと思います。 – Josh

+0

私の他の質問はどうですか?正確に何を照会しようとしているのかはわかりません。 – schwobaseggl

答えて

1

最も簡単にはHikeManyToManyFieldを追加することです:

class Hike(models.Model): 
    ... 
    users = models.ManyToManyField(User, through='app.UserLog') 

あなたはUserLogで余分なフィールドを持っていない場合は、あなたもalltogether UserLogモデルとthroughパラメータを削除することができます。あまりにも多くのクエリを避けるために

{% for hike in qs %} 
    {{ hike.name }}{{ hike.other_details_and_stuff }} 
    {% for user in hike.users.all %}{{ user.name }}{% endfor %} 
{% endfor %} 

、あなたはビューのHikeクエリでユーザーをプリフェッチする必要があります:あなたが行うことができますテンプレートでManyToManyFieldなければ

qs = Hike.objects.all().prefetch_related('users') 

、あなたがプロパティを追加することができますユーザは同じテンプレートを使用しますが、プリフェッチ句を簡単に使用できませんでした。

class Hike(models.Model): 
    ... 
    @property 
    def users(self): 
     return User.objects.filter(userlog__hike=self) 
+0

これはUserLogが定義されていないというエラーを返します。おそらくHikeモデルがmodels.pyの最初にリストされているからです。注文を切り替えると、Hikeが定義されていないというエラーが表示されます。はい、残念ながら、私はUserLogモデルに他のフィールドがあるので、それを取り除くことはできません。 – Josh

+0

更新されました。スルーに '' app_name.model_name''表記を使用してください。これには、新しい移行、btwも必要です。 – schwobaseggl

+0

残念ながら運がまだありません。私はそれをすべて追加して移行しましたが、まだ何もありません。私がシェルに入ってハイキングをフェッチした後、 "users"フィールドを呼び出してみると、次のようになります: .ManyRelatedManagerオブジェクト(0x000001C9E40EAB70)> – Josh

関連する問題