2015-04-07 52 views
0

我有一個Person模型,和Address模型。一個person可以有多個地址,所以Address模型的樣子:動態序列化與Django REST

Address(models.Model): 
    person = models.ForeignKey(Person, related_name="addresses") 
    ... 

我想序列化person實例,我做最簡單的事情:

PersonSerializer(serializers.ModelSerializer): 
    class Meta: 
     fields = (..., "addresses", ...) 

然而,假設我要根據當前的request.user序列化addresses,以便不同的電流user查看不同的地址集,我該如何修改代碼?

回答

0

如果你是一個詳細視圖這樣做,你應該執行一個串行的地址模型也一樣。有關嵌套序列化器關係,請參閱this example。另外,在您的api視圖中,您必須根據request.user進行查詢。

如果您正在爲列表視圖執行此操作,PersonSerializer應具有Seri​​alizerMethodField。有了這個,用戶將能夠看到他自己的地址,並將無法看到其他人的地址。

class PersonSerializer(serializers.ModelSerializer): 
    addresses = serializers.SerializerMethodField('get_addresses') 

    class Meta: 
     fields = (..., "addresses", ...) 

    def get_addresses(self, obj): 
     if obj.pk != self.context['request'].user.pk: 
      return "" 
     else: 
      return obj.addresses 

P.S:我假設你的自定義用戶模型是Person,因爲你沒有提供太多的信息。

+0

請記住,序列化程序也應該在請求/響應循環之外工作。它並不總是有可用的請求對象。 –

+0

完美,'SerializerMethodField'是我想要的。 – Lelouch

0

我假設你想要一個像/ user/current /這樣的靜態端點,它給你當前請求用戶的Person對象+關聯的地址記錄。添加一個觀點是這樣的:

class CurrentUser(GenericAPIView): 
    model = Person 
    serializer_class = PersonSerializer 
    permission_classes = (permissions.IsAuthenticated,) 

    def get(self, request): 
     return Response(self.get_serializer(request.user).data) 

如果用戶不是匿名的,並且會使用你的PersonSerializer傾倒了請求用戶這只是訪問。相關的地址記錄一起走,你想,如果你相應地設置「地址」串行領域,如下所述:

http://www.django-rest-framework.org/api-guide/relations/#nested-relationships