2017-02-26 69 views
1

我有一個網站,該網站可以對本地遠足進行編目,並且用戶可以記錄他們在遠足時的情況。我有一個包含徒步旅行的搜索頁面,我試圖展示的一個領域是所有參加徒步旅行的人員列表。我已經在加息的單個詳細信息頁面中找到了這一點,但無法弄清楚如何在正在打印遠足的查詢集中創建新的查詢集,以便在搜索頁面上顯示此信息。列出模板中的ForeignKey關聯實例(查詢集中的查詢集)

下面是一些代碼:

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 queryset中特定加息有關的所有用戶。 – Josh

+0

我的其他問題呢?對我而言,你並不清楚你究竟想要查詢什麼? – schwobaseggl

回答

1

最簡單的就是增加一個ManyToManyFieldHike

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

如果在UserLog沒有額外的字段,你甚至可以刪除UserLog模型和產品總數的through參數。在模板,你可以這樣做:

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

爲了避免過多的查詢,您應該預取用戶在Hike查詢視圖:

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

沒有ManyToManyField,你可以添加一個屬性和用戶使用相同的模板,但預取子句無法輕鬆使用:

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

這將返回UserLog未定義的錯誤。大概是因爲Hike模型在我的models.py中首先列出。如果我切換訂單,我會收到一個錯誤,說明遠端沒有定義。是的,不幸的是,我的UserLog模型中還有其他字段,所以無法擺脫它。 – Josh

+0

更新。只需使用「app_name.model_name」表示法即可。這也將需要一個新的遷移,順便說一句。 – schwobaseggl

+0

不幸的是,還是沒有運氣。我已經添加了所有內容並已遷移,但仍然沒有任何內容。當我進入shell並獲取遠足時,然後嘗試調用「users」字段,我得到以下內容:。許多相關管理器對象在0x000001C9E40EAB70> – Josh