从Django休息框架

时间:2017-01-16 23:40:15

标签: django django-rest-framework

我正在尝试使用Django Rest Framework构建API。我不熟悉哪个。我想知道如何使用引用和关联表来提取数据。我有三个模型用户,公司和评论。我在用户表中存储和Auth_token,我希望能够通过将身份验证令牌放在地址栏中来吸引某个用户的评论。

我的模特

class User(models.Model):
    user_name = models.CharField(max_length=45)
    email = models.CharField(max_length=255)
    auth_Token = models.CharField(max_length=100,default=uuid.uuid4)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

def __str__(self):
    return self.user_name

class Company(models.Model):
    company_name = models.CharField(max_length=255)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

def __str__(self):
    return self.company_name

class Review(models.Model):
    title = models.CharField(max_length=64)
    rating = models.IntegerField(blank=False)
    summary = models.TextField(max_length=10000)
    ip = models.GenericIPAddressField()
    company = models.ForeignKey(Company)
    user = models.ForeignKey(User)
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)

def __str__(self):
    return self.title

我目前能够使用以下apiview提取评论:

class ReviewView(APIView):
    def get(self,request):
        reviews = Review.objects.all()
        serializer = ReviewSerializer(reviews, many=True)
        return Response(serializer.data)

以及以下的序列号:

 class ReviewSerializer(serializers.ModelSerializer):
     class Meta:
         model = Review
         fields = ('title','company', 'rating', 'summary','user')

请忽略缩进。但是,这导致我只返回公司ID和用户ID。我基本上想在这里知道两件事。

首先如何在auth令牌作为url

传递的地方提取数据
url(r'^reviews/(?P<auth_Token>[\w-]+)/$', ReviewView.as_view()),

第二,我如何显示公司名称和用户名而不是ID。任何帮助都会很棒。感谢

1 个答案:

答案 0 :(得分:0)

  1. 如何根据用户的身份验证令牌过滤评论?
  2. 我建议使用ReadOnlyModelViewSet。它将大大减少您的视图代码并允许轻松过滤。处理请求,验证等的大多数平凡和疲惫的代码已经写在这些视图集中,因此,您可以只关注业务逻辑而不是服务器端详细信息。

    我没有在URL参数本身使用auth_Token(例如reviews/XXX/),而是将其作为查询参数(例如reviews/?auth_Token=XXX)。这背后的原因是因为URL参数本身应返回特定的评论资源,但您需要返回映射到一个用户的过滤评论列表。

     from rest_framework import viewsets
    
     class ReviewView(viewsets.ReadOnlyModelViewSet):
        serializer_class = ReviewSerializer
    
    
        def get_queryset(self):
            """
            This function is called whenever someone tries to retrieve reviews. 
            You do not need to worry about serialization or handling the response 
            as the viewset has set that up with your specified serializer_class
            """
    
            auth_Token = self.query_params.get("auth_Token", None)
            if auth_Token: # They provided an auth token so we need to filter.
                reviews = Review.objects.filter(user__auth_Token=auth_Token)
            else:
                 reviews = Review.objects.all()
            return reviews
    

    urls

    url(r'^reviews/$', ReviewView.as_view({"get":"list"})),
    
    1. 如何在检索到的评论中显示公司名称和用户名,而不显示其ID?
    2. 您需要使用SlugRelatedFieldhttp://www.django-rest-framework.org/api-guide/relations/#slugrelatedfield)。此字段允许您将典型的id替换为关联表中的其他属性。请参阅下面的新ReviewSerializer

      class ReviewSerializer(serializers.ModelSerializer):
      
          company = serializers.SlugRelatedField(read_only=True, slug_field="company_name")
      
          user = serializers.SlugRelatedField(read_only=True, slug_field="user_name")
      
          class Meta:
              model = Review
              fields = ('title','company', 'rating', 'summary','user')