【发布时间】:2020-07-21 19:40:21
【问题描述】:
我想创建一个自定义查询集类,它返回不同的字段来预定义两种情况。
- 当
DateField大于今天时 - 不到今天。
如果更大,则返回所有字段,否则仅返回 date_to_open 和 post_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