2016-08-23 64 views
1

我有4個表:如何與其他模型值過濾結果 - Django的restframework

Book: 
- id 
- name 
- user_id #(ForeignKey) 
- visitor_id #(ForeignKey) 

Car: 
- id 
- name 
- user_id #(ForeignKey) 
- visitor_id #(ForeignKey) 

Pen: 
- id 
- name 
- user_id #(ForeignKey) 
- visitor_id #(ForeignKey) 

Role: 
- id 
- obj_type #(ChoicesField. equals `1`,`2` or `3`) 
- obj_id 
- obj_role #(Boolean) 
- visitor_id #(ForeignKey) 

現在我有這樣的串行:

class BookSerializer(serializers.ModelSerializer): 
    queryset = Book.objects.filter(?!?!?) # Here I need help 
    serializer_class = BookSerializer 

我要檢查Role表,並根據過濾BookRole的結果。我如何做到這一點?什麼是最佳解決方案?

我想是這樣的:

queryset = Book.objects.filter(
    ID__in(Role.objects.filter(user=request.user, obj_id=book_id, role__gt=0)) 
) 

回答

1

您可以定義get_queryset方法:

class BookSerializer(serializers.ModelSerializer): 
    queryset = Book.objects.all() 

    def get_queryset(self): 
     # current user is self.request.user 
     return self.queryset.filter(....) 
例如,如果您只想讓書的主人看/編輯書

class BookSerializer(serializers.ModelSerializer): 
    queryset = Book.objects.all() 
    # ... 

    def get_queryset(self): 
     return self.queryset.filter(user_id=self.request.user.pk) 

更新:你需要這樣的:

items = Role.objects.filter(user=request.user, role__gt=0).values_list("pk", flat=True) 
return self.queryset.filter(pk__in=items) 
+0

我該如何檢查每本書的角色? – Chalist

+0

@chalist我已經更新了我的答案 – aliva

+0

我需要爲每行添加這種檢查:'Role.objects.filter(user = request.user,role__gt = 0,obj_id = Book.id)'?! – Chalist