【问题标题】:How to return specific field queryset DRF如何返回特定字段查询集 DRF
【发布时间】:2020-07-21 19:40:21
【问题描述】:

我想创建一个自定义查询集类,它返回不同的字段来预定义两种情况。

  1. DateField 大于今天时
  2. 不到今天。

如果更大,则返回所有字段,否则仅返回 date_to_openpost_name 字段。

views.py

class GroupDetail(generics.RetrieveAPIView):
    serializer_class = serializers.GroupDetailsSerializer
    permission_classes = (IsAuthenticated, )

    def greater(self):
        return models.Group.objects.filter(shared_to=self.request.user, 
           date_to_open__gt=timezone.now()).exists()

 

    def get_queryset(self, *args, **kwargs):
        if self.greater():
            query_set = models.Group.objects.filter(shared_to=self.request.user, 
               date_to_open__gt=timezone.now())
        else:
            query_set = SPECIFIC FIELDS
        return query_set

serializers.py

class GroupDetailsSerializer(serializers.ModelSerializer):

    owner = serializers.ReadOnlyField(source='owner.name')
    images = GroupImageSerializer(many=True, read_only=True)
    shared_to = serializers.SlugRelatedField(queryset=models.UserProfile.objects.all(), 
       slug_field='name', many=True)

    class Meta:
        model = models.Group
        fields = ('id', 'group_name', 'owner', 'group_text', 'created_on', 'date_to_open', 'shared_to', 
    'images', )

【问题讨论】:

  • 覆盖get_serializer_class() 类并检查其中的greater(),而不是get_queryset()
  • @ArakkalAbu 你能否在答案中展示我如何做到这一点?我也会投赞成票:)
  • 您是否尝试根据date_to_open 的值更改基于每个实例返回的字段?如果是这样,那是不可能的。更改您的序列化程序或更改 get_queryset 将影响此视图返回的所有对象。

标签: django rest django-rest-framework django-views django-queryset


【解决方案1】:

好的。感谢@ArakkalAbu 评论,我刚刚覆盖了get_serializer_class()

views.py

class GroupDetail(generics.RetrieveAPIView):
    queryset = models.Group.objects.all()
    serializer_class = serializers.GroupDetailsSerializer
    permission_classes = (IsAuthenticated, )

    def greater(self):
        return models.Group.objects.filter(shared_to=self.request.user, date_to_open__gt=timezone.now()).exists()


    def get_serializer_class(self):
        if self.greater():
            return serializers.GroupDetailsSerializer
        else:
            return serializers.ClosedGroupDetailsSerializer

【讨论】:

    【解决方案2】:

    您可以继续使用相同的逻辑并使用values_list 从查询集中返回特定值。返回的值也是一个查询集

    def get_queryset(self, *args, **kwargs):
        if self.greater():
            return models.Group.objects.filter(shared_to=self.request.user, date_to_open__gt=timezone.now())
        else:
            return models.Group.objects.filter(shared_to=self.request.user, date_to_open__lt=timezone.now()).values_list('date_to_open', 'post_name' , flat = True)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2015-11-13
      • 1970-01-01
      • 2019-08-05
      相关资源
      最近更新 更多