【问题标题】:How to call a view class from another view class in django rest framework?如何从 django rest 框架中的另一个视图类调用视图类?
【发布时间】:2019-09-13 06:06:30
【问题描述】:

我有一个项目结构如下,

..
├── project
│    ├── app1
│    └── app2
│         ├── app2_views
│              ├── main_view.py
│              ├── view1.py
│              ├── view2.py


我想在我的main_view.py 中调用view1.py 中定义的类

我试过下面的代码,

main.py

from rest_framework import viewsets
from app2.app2_views.view1.py import class1

class mainclass(viewsets.ModelViewSet):

    class1.view1_data()

view1.py

from app2.models.py import table1 
from rest_framework import viewsets
from app2.serializers.py import seri1
from django.db.models import Sum

class class1(viewsets.ModelViewSet):

    def view1_data():
        queryset = table1.objects.values('column')
        serializer_class = seri1

seri1.py

from rest_framework import serializers
from app2.models import table1
class seri1(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = table1
        fields = ['column']

但我在 main.py 中遇到错误说

should either include a `serializer_class` attribute, or override the `get_serializer_class()` method

因为我已经在view1.py 中包含了序列化程序类,所以我不想在main_view.py 中再做一次。 我是python新手,我在这里做错了什么? 我也想让view1.py>class1 和main.py>mainclass 都可以通过 url(rest 框架管理门户)访问,我该怎么做?

目前我的 urls.py 是,

from django.urls import include, path
from rest_framework import routers
from . import views
from .app2 import view1, main_view

router = routers.DefaultRouter(trailing_slash=False)
router.register(r'^view1', main_view.mainclass, basename='mis_trx_data')
router.register(r'^main_view', view1.class1, basename='mis_trx_data')

urlpatterns = [
    path('', include(router.urls)),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]

感谢您的建议

【问题讨论】:

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


    【解决方案1】:

    您需要在 ModelViewSet 中指定一个名为 serializer_class 的类级别变量

    class class1(viewsets.ModelViewSet):
        serializer_class = MySerializer
        def view1_data():
            queryset = table1.objects.values('column')
            serializer = self.serializer_class(request.data)
    

    Ajax 请求将表单数据发送到 API

    $.ajax({
        url: api-end-point,
        data: JSON.stringify($("#form").serialize()),
        success: function (E){
            console.log("sucess");
        },
        error: function(e){
            console.log("error");
        }
    });
    

    【讨论】:

    • 我已经根据我的查询集(queryset)制作了序列化器(serializer_class)。为什么我必须创建另一个MySerializer,我在其中指定了什么?
    • 您在方法内有serializer_class,这将变量的范围限制为该方法本身。您需要声明一个类级别变量,即在任何方法之前。我已经编辑了我的答案以反映相同的情况。
    • request.data 来自哪里?
    • request.data 来自您对 API 端点进行的 Ajax 调用,它具有序列化为您要保存的 JSON 的表单数据。我已经编辑了我的答案以反映相同的情况。
    • 我在main.py 中遇到错误,而不是在view1.py 中。即使我按照您的建议进行操作,我在main.py 中再次遇到错误说should either include a `queryset` attribute, or override the `get_queryset()` method.。跨度>
    猜你喜欢
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多