【问题标题】:How can I create API with Django and API REST Framework but based on existing models?如何使用 Django 和 API REST Framework 但基于现有模型创建 API?
【发布时间】:2015-09-22 16:14:37
【问题描述】:

我有一个 Django 项目,我需要基于项目的现有模型创建 API REST。我的意思是,是否可以只导入 api/v1/models.py 中的模型?而且我需要使用嵌套的序列化程序,但我不太了解文档。


更新:

我有一个项目“酒店”,在项目中我有各种应用程序,例如“预订”、“面板”、“联系”等等。因此,每个应用程序都有模型、视图、url。

我需要根据每个模型创建 API REST。现在我创建了一个名为“api”的带有rest-framework的新应用程序,并且在模型中我只导入其他应用程序的模型。基本上这是我项目的根。

hotel/
     booking/
             __init__.py
             views.py
             models.py
             forms.py
             urls.py
     panel
     contact
     api/ (with rest-framework)
             __init__.py
             models.py
             serializers.py
             urls.py
             views.py

实际上在api中是这样的结构:

# models.py
from booking.models import ReserveClient, CodeClient, CodeHour


# serializers.py
from rest_framework import serializers
from api.models import CodeClient, CodeHour

class CodeHourSerializer(serializers.ModelSerializer):
    class Meta:
        model = CodeHour
        fields = (
            'hours', 
            'min_hours',
        )

class CodeClientSerializer(serializers.ModelSerializer):  
    class Meta:
        model = CodeClient
        fields = (
            'id', 
            'code', 
            'date', 
            'max_use', 
            'unique_for_user', 
            'new_client', 
            'message', 
            'comment', 
        )

# views.py
import django_filters
from api.models import CodeClient, CodeHour
from api.serializers import CodeClientSerializer, CodeHourSerializer

class CodeClientFilter(django_filters.FilterSet):
    class Meta:
        model = CodeClient
        fields = ['code']


class CodeClientList(mixins.ListModelMixin,
                mixins.CreateModelMixin,
                generics.GenericAPIView):
    queryset = CodeClient.objects.all()
    serializer_class = CodeClientSerializer
    filter_backends = (filters.DjangoFilterBackend,)
    filter_class = CodeClientFilter

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

好的,现在我想用两个序列化器生成一个视图,因为我需要这样的响应 JSON:

[
  {
    id: 4,
    code: "3hours",
    date: null,
    max_use: 0,
    unique_for_user: true,
    new_client: true,
    menssage: "",
    comment: "",

    hours: "", (CodeHourSerializer)
    min_hours: "", (CodeHourSerializer)
  }
]

希望代码会更容易理解。

谢谢。

古斯塔沃。

【问题讨论】:

  • 谢谢,我会更新问题

标签: python django api rest django-rest-framework


【解决方案1】:

我需要根据项目模型创建 API REST

DRF 为此提供了一个ModelViewSet,您只需将其绑定到您的模型之一

class MyModelViewSet(viewsets.ModelViewSet):
    """
    A viewset for viewing and editing user instances.
    """
    serializer_class = MyModelSerializer
    queryset = MyModel.objects.all()

http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset

我需要使用嵌套的序列化器 对于您的序列化程序,您可以这样做:

class MyModelSerializer(serializers.ModelSerializer):
    nested_field = MyOtherModelSerializer()

    class Meta:
        model = MyModel
        fields = ('field1', 'field2', 'field3')

http://www.django-rest-framework.org/api-guide/serializers/#specifying-nested-serialization

【讨论】:

  • 谢谢,但我有这个例子。
【解决方案2】:

不确定您的模型是什么样的,但我认为您只需要在 CodeClientSerializer 上添加 SerializerMethodField。

class CodeClientSerializer(serializers.ModelSerializer):
    hours = serializers.SerializerMethodField()
    min_hours = serializers.SerializerMethodField()

    class Meta:
        model = CodeClient
        fields = (
            ...
            'hours', 
            'min_hours',
        )


    def get_hours(self, obj):
        return HOURS # set your value here

    def get_min_hours(self, obj):
        return MIN_HOURS # set your value here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-14
    • 2014-05-13
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    相关资源
    最近更新 更多