2015-10-13 66 views
0

我是Django的總新手,所以這可能有一個明顯的答案,但迄今谷歌還沒有爲我工作。如何根據組顯示與登錄用戶相關的數據?

我有這個骨架應用程序使用Django 1.8。 我有一個簡單的模型,它擁有一個屬於ForeignKey的所有者字段。 當用戶登錄時,我只想顯示他/她有權訪問的項目。訪問由用戶屬於同一組的事實決定。

model.py

class Device(models.Model): 
    name = models.CharField(max_length=100,db_index=True) 
    owner = models.ForeignKey(Group) 
    def __str__(self): 
     return self.name 

views.py

from django.contrib.auth.decorators import login_required 
from django.utils.decorators import method_decorator 

from django.views import generic 

from .models import Device 
from django.contrib.auth.models import Group, User 


class IndexView(generic.ListView): 
    """ 
    This renders the index page listing the devices a user can view 
    """ 
    template_name = 'devices/index.html' 
    context_object_name = 'devices_list' 

    @method_decorator(login_required) 
    def dispatch(self, *args, **kwargs): 
      return super(IndexView, self).dispatch(*args, **kwargs) 

    def get_queryset(self): 
     """ 
     Return the devices visible to the logged-in user 
     """ 
     return devices=Device.objects.all() 

似乎我不能夠弄清楚是把在.filter什麼()來代替。所有()調用我的get_queryset方法。

回答

0

根據Jean-Michel的反饋進行更新。

我沒有在此刻我的面前Django的環境,但是這可能是一個良好的開端:

return devices=Device.objects.filter(owner=self.request.user.groups.all()) 

另外,Django的ORM使用雙下劃線(__)來訪問現場查找。這些可用於獲取大於(__gt)的值,或者在其他查找(see the docs)中的列表中(__in)。

return devices=Device.objects.filter(owner__in=self.request.user.groups.all()) 

這種取決於用戶對象的位置。我假設登錄用戶保留爲類屬性,即self.user。根據Jean-Michel的評論,用戶對象被附加到請求中。所以我們可以從self.request.user.groups訪問它。

最後,您可以訪問使用雙下劃線符號以及(__)模型的特定領域,這個例子是the docs

# Find all Articles for any Reporter whose first name is "John". 
>>> Article.objects.filter(reporter__first_name='John') 
[<Article: John's second story>, <Article: This is a test>] 
+0

感謝在正確的方向指針。我的理解中缺少的是field_in語法。現在我已經理解了這個概念,我可以進入下一個障礙(將會是什麼)。 最終的答案是: 'return Device.objects.filter(owner__in = self.request.user.groups.all())' –

+0

@ Jean-MichelRubillon,很高興它讓你朝着正確的方向前進。我根據您的反饋更新了答案,並加入了其他參考資料。乾杯。 – James

+0

感謝@TechMedicNYC提供全面的響應和微妙的方向。 –

相關問題