代码之家  ›  专栏  ›  技术社区  ›  Adnan

基于对象之间关系应用筛选器-django rest框架

  •  0
  • Adnan  · 技术社区  · 8 年前

    我有两个模型。

    Account:
        id, name, age, discoverable
    Friendship:
        id, requestor, acceptor (requestor and acceptor are Account IDs)
    

    我需要写两个api。

    1. 使所有帐户都具有discoverable=true。我在accountviewset中对查询集应用filter来实现这一点,如下所示:

      def filter_queryset(self, queryset):  
          queryset = queryset.filter(discoverable=True).all()     
          return queryset
      
    2. 使用以下URL方案获取帐户详细信息 <server-url>/accounts/1 其中1是帐户ID。此API应返回:

      • 如果帐户1不可发现,并且帐户1不是调用此API的已验证帐户的好友,则为空。
      • 如果请求帐户和帐户1都是朋友,即他们在友谊表中有一个条目,则应该返回帐户1详细信息,即使帐户1不可发现。
    1 回复  |  直到 8 年前
        1
  •  0
  •   Adnan    8 年前

    我可以通过如下重写accountviewset的get_object()方法来实现它。

    def get_object(self, queryset=None):
            """
            Fix - If account has already sent a friend request, show it even if user set 
            discoverable = False
            """
            pk = self.kwargs.get('pk', None)
            account = Account.objects.filter(id=pk).first()
            if account:
                if account.is_friends_with(self.request.user, True):
                    self.check_object_permissions(self.request, account)
                    return account
            #default handling in case they are not friends
            return super(viewsets.GenericViewSet, self).get_object()