标签: drf-queryset

Django Rest框架中的queryset与filter_backends

我是 DRF 的新手。我在http://www.django-rest-framework.org/api-guide/filtering/#filtering-and-object-lookups上浏览了过滤查询集的示例

此链接包含有关查询集过滤以及 DjangoFilterBackend 的描述。据我所知,它们服务于相同的目的。但尚不清楚何时使用其中任何一种。在某些情况下,同时使用 queryset 和 filter_backends :-

class UserListView(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = (filters.OrderingFilter,)
    ordering_fields = ('username', 'email')
Run Code Online (Sandbox Code Playgroud)

谁能告诉我,这两者之间有什么区别?必须使用这两者中的哪一种,在什么情况下,我们必须优先选择其中一种?

提前致谢

python django django-rest-framework drf-queryset

5
推荐指数
1
解决办法
5286
查看次数

注释:m2m字段中是否存在给定值

我有一个检索像这样的对象的查询:

{
    "id": 1,
    "tags": [1, 2, 3]
}
Run Code Online (Sandbox Code Playgroud)

我想检查tags对象的字段中是否存在给定的标记(例如 1),并将annotate检查结果作为对象的字段:

{
    "id": 1,
    "tagged": true
}
Run Code Online (Sandbox Code Playgroud)

这就是我想出的

annotate(
    tagged=Exists(
        Articles.tag_set.through.objects.filter(
            article_id=OuterRef("pk"), tag_id=tag.id
        )
    )
)
Run Code Online (Sandbox Code Playgroud)

由于该关系tags已由主查询加载,因此对我来说,拥有辅助查询似乎是多余的。

有没有更简单的方法来构造这个查询?类似于过滤器in查找语法的东西。

python django django-queryset django-rest-framework drf-queryset

5
推荐指数
1
解决办法
1091
查看次数

DRF:如何在使用深度选项的序列化器中隐藏密码?

我正在为模型使用下面的序列化器User,但是当我使用深度来处理外键时,密码会显示在User对象中。

用户序列化器:

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        read_only_fields = ('is_active', 'is_staff', 'is_superuser',)
        exclude = ('password', )
        extra_kwargs = {'password': {'write_only': True, 'min_length': 4}}
Run Code Online (Sandbox Code Playgroud)

在下面的序列化器中一切都很好:

class AuditSerializer(serializers.ModelSerializer):
    def __init__(self, instance=None, **kwargs):
        if instance:
            setattr(self.Meta, 'depth', 10)
        else:
            setattr(self.Meta, 'depth', 0)
        super(AuditSerializer, self).__init__(instance, **kwargs)

    initiator = UserSerializer(read_only=True)

    class Meta:
        model = Audit
        fields = ['id', 'initiator']
        read_only_fields = ['id', 'initiator']
        depth = 0
Run Code Online (Sandbox Code Playgroud)

但在下面与之前的模型/序列化器相关的内容中,我遇到了密码问题:

class AuditAttachmentSerializer(serializers.ModelSerializer):
    def __init__(self, instance=None, **kwargs):
        if instance:
            setattr(self.Meta, 'depth', 10)
        else: …
Run Code Online (Sandbox Code Playgroud)

python django django-serializer django-rest-framework drf-queryset

5
推荐指数
1
解决办法
2045
查看次数

如何对视图集使用限制偏移分页

视图.py

class CountryViewSet(viewsets.ViewSet):   
    serializer_class = CountrySerializer
    pagination_class = LimitOffsetPagination
    def list(self,request):
        try:
            country_data = Country.objects.all()
            country_serializer = CountrySerializer(country_data,many=True)
            return Response(            
                data = country_serializer.data,
                content_type='application/json',            
                )
        except Exception as ex:
            return Response(
                data={'error': str(ex)},
                content_type='application/json',
                status=status.HTTP_400_BAD_REQUEST
                )
Run Code Online (Sandbox Code Playgroud)

我添加的 Settings.py

'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
Run Code Online (Sandbox Code Playgroud)

在我的 urls.py

router = routers.DefaultRouter(trailing_slash=False)

router.register(r'country', CountryViewSet, base_name='country')
urlpatterns = [
    url(r'^', include(router.urls)),
]
Run Code Online (Sandbox Code Playgroud)

当我尝试使用此 URL http://192.168.2.66:8001/v1/voucher/country 时,它正在返回所有数据。

但是当我尝试使用这个 URL http://192.168.2.66:8001/v1/voucher/country/?limit=2&offset=2

但它返回 404 错误。我是 django 的新手。请帮助我:)

django django-rest-framework drf-queryset

3
推荐指数
1
解决办法
8020
查看次数

如何在django Rest框架中序列化外键字段

我在一个使用 DRF 的项目中工作,我得到的序列化器数据如下,这绝对没问题:

{
    "message": "Updated Successfully",
    "status": 200,
    "errors": {},
    "data": {
        "id": 8,
        "user": 2,
        "item": 1,
        "quantity": 4,
        "created_at": "2021-08-11T13:49:27.391939Z",
        "updated_at": "2021-08-11T13:51:07.229794Z"
    }
}
Run Code Online (Sandbox Code Playgroud)

但我想得到如下:

{
    "message": "Updated Successfully",
    "status": 200,
    "errors": {},
    "data": {
        "id": 8,
        "user": "user name",
        "item": "product name",
        "price: "3.44",
        "quantity": 4,
        "created_at": "2021-08-11T13:49:27.391939Z",
        "updated_at": "2021-08-11T13:51:07.229794Z"
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用 DRF RelatedFieldPrimaryKryRelatedField但在所有这些情况下,我需要创建read_only=True我想跳过的相应字段。

我也尝试过depth = 1它给出了完整的细节

我的型号:

class Cart(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    item = …
Run Code Online (Sandbox Code Playgroud)

django django-serializer django-rest-framework django-rest-viewsets drf-queryset

1
推荐指数
1
解决办法
9705
查看次数