Python 在django的url中发送参数
我有两种型号:Python 在django的url中发送参数,python,django,django-models,django-rest-framework,django-forms,Python,Django,Django Models,Django Rest Framework,Django Forms,我有两种型号: class Tag(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=255) def __str__(self): return self.name class Question(models.Model): name = models.CharField(max_length=255)
class Tag(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Question(models.Model):
name = models.CharField(max_length=255)
Tag_name = models.ManyToManyField(Tag)
def __str__(self):
return self.name
views.py
class QuestionList(APIView):
def get(self, request, tag_id):
res = Question.objects.filter(Tag_name=tag_id).prefetch_related('Tag_name').order_by('name')[:10]
print(res)
serializer = QuestionSerializers(res, many=True)
data = {}
return Response(serializer.data)
# return Response(data)
url.py
urlpatterns = [
path('admin/', admin.site.urls),
path('tag=<int:tag_id>/', views.QuestionList.as_view()) //this needs to be edited
]
因此,我得到了所有带有标记4的问题,并按名称排序?这不是路径的一部分。这些参数可以在请求.GET
对象中获得,该对象类似于字典
因此,您的路径应该如下所示:
path('/', views.QuestionListView.as_view()),
在问题列表视图中
,您可以过滤这些参数:
class QuestionListView(ListAPIView):
model = Question
serializers = QuestionSerializers
def get_queryset(self, *args, **kwargs):
queryset = super().get_queryset(*args, **kwargs)
if 'tag' in self.request.GET:
queryset = queryset.filter(
Tag_name=self.request.GET['tag']
)
if 'order_by' in self.request.GET:
queryset = queryset.order_by(self.request.GET['order_by'])
return queryset
# …
类问题列表视图(列表视图):
模型=问题
序列化程序=问题序列化程序
def get_queryset(self、*args、**kwargs):
queryset=super()
如果self.request.GET中有“tag”:
queryset=queryset.filter(
Tag_name=self.request.GET['Tag']
)
如果self.request.GET中的“order_by”:
queryset=queryset.order\u by(self.request.GET['order\u by'])
返回查询集
#…
这就是说,上述需要额外的脚手架。在这里,您允许用户通过(…)在.order\u中“注入”项目。黑客可以利用这一点,例如对相关数据的元素进行排序,从而对某些字段进行二进制搜索
值得一看的是,您可以根据您可以过滤的元素等进行定义。它将进一步封装过滤,从而方便在不同的视图中使用它
注意:通常Django模型中字段的名称是用snake_大小写的,而不是PerlCase,因此它应该是:tags
而不是Tag_name
。这是因为ManyToManyField
指零个、一个或多个标记,而且它指的是标记对象,而不是标记的名称
注意:与其从头开始实现视图,不如看一看
这个
这已经可以实现很多样板代码
该路径不是路径的一部分。这些参数可以在请求.GET
对象中获得,该对象类似于字典
因此,您的路径应该如下所示:
path('/', views.QuestionListView.as_view()),
在问题列表视图中
,您可以过滤这些参数:
class QuestionListView(ListAPIView):
model = Question
serializers = QuestionSerializers
def get_queryset(self, *args, **kwargs):
queryset = super().get_queryset(*args, **kwargs)
if 'tag' in self.request.GET:
queryset = queryset.filter(
Tag_name=self.request.GET['tag']
)
if 'order_by' in self.request.GET:
queryset = queryset.order_by(self.request.GET['order_by'])
return queryset
# …
类问题列表视图(列表视图):
模型=问题
序列化程序=问题序列化程序
def get_queryset(self、*args、**kwargs):
queryset=super()
如果self.request.GET中有“tag”:
queryset=queryset.filter(
Tag_name=self.request.GET['Tag']
)
如果self.request.GET中的“order_by”:
queryset=queryset.order\u by(self.request.GET['order\u by'])
返回查询集
#…
这就是说,上述需要额外的脚手架。在这里,您允许用户通过(…)
在.order\u中“注入”项目。黑客可以利用这一点,例如对相关数据的元素进行排序,从而对某些字段进行二进制搜索
值得一看的是,您可以根据您可以过滤的元素等进行定义。它将进一步封装过滤,从而方便在不同的视图中使用它
注意:通常Django模型中字段的名称是用snake_大小写的,而不是PerlCase,因此它应该是:tags
而不是Tag_name
。这是因为ManyToManyField
指零个、一个或多个标记,而且它指的是标记对象,而不是标记的名称
注意:与其从头开始实现视图,不如看一看
这个
这已经可以实现很多样板代码
如果要使用此Url通过Django发送多个Url参数:
http://127.0.0.1:8000?tag=4&order_by=name
使用URL.py中的路径尝试以下操作:
path('tag=<int:tag_id>/order_by=<str:name>', views.QuestionList.as_view())
path('tag=/order\u by=',views.QuestionList.as\u view())
您有一个很好的例子,或者在我的博客中找到关于Django的文章。如果您想使用此Url向Django发送多个Url参数:
http://127.0.0.1:8000?tag=4&order_by=name
使用URL.py中的路径尝试以下操作:
path('tag=<int:tag_id>/order_by=<str:name>', views.QuestionList.as_view())
path('tag=/order\u by=',views.QuestionList.as\u view())
你有一个很好的例子,或者在我的博客中找到关于Django的文章。查询字符串不是路径的一部分。那么我该如何实现这一点呢?有人能给我发送views.py进行查询吗?请显示您的视图。py刚刚添加的views.py文件查询字符串不是路径的一部分。好的,那么我该如何实现?有人能给我发送views.py进行查询吗?请显示给我们your views.py刚刚添加了views.py文件有趣的警告。我希望Django有一个现成的方法来修复这个注入漏洞。它一定很受欢迎task@DeepSpace:问题是您无法解决此问题,因为用户可能希望在.order\u by('user\u password')
上排序(请注意,这将使用散列,但是,公开密码散列仍然不是一个好主意).“super”对象没有属性“get_queryset”是一个错误getting@code_freak4:在一个简单的apieview
中,确实没有get\u queryset
。您是否使用了ListAPIView
?您的意思是我使用ListAPIView而不是get\u queryset?有趣的警告。我希望Django有一个现成的方法来修复这个注入漏洞。它一定很受欢迎task@DeepSpace:问题是您无法解决此问题,因为用户可能希望在.order\u by('user\u password')
上排序(请注意,这将使用散列,但是,公开密码散列仍然不是一个好主意).“super”对象没有属性“get_queryset”是一个错误getting@code_freak4:在一个简单的apieview
中,确实没有get\u queryset
。您是否使用了ListAPIView
?您的意思是我使用ListAPIView而不是get\u queryset?