我是 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)
谁能告诉我,这两者之间有什么区别?必须使用这两者中的哪一种,在什么情况下,我们必须优先选择其中一种?
提前致谢
我有一个检索像这样的对象的查询:
{
"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
我正在为模型使用下面的序列化器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
视图.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 的新手。请帮助我:)
我在一个使用 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 RelatedField
,PrimaryKryRelatedField
但在所有这些情况下,我需要创建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