1. 程式人生 > >django-rest-framework(serialization)

django-rest-framework(serialization)

mode url setting div 價格 forms 設置 參數設置 gen

Requirements:

coreapi (1.32.0+) - Schema generation support.
Markdown (2.1.0+) - Markdown support for the browsable API.
django-filter (1.0.1+) - Filtering support.
django-crispy-forms - Improved HTML display for filtering.
django-guardian (1.1.1+) - Object level permissions support.

$ pip install coreapi markdown django-filter django-crispy-forms django-guardian djangorestframework

  

settings.py

INSTALLED_APPS = (
    ...
    ‘rest_framework‘,
) 

urls.py

from django.conf.urls import include

urlpatterns = [
    ...
    url(r‘^api-auth/‘, include(‘rest_framework.urls‘))
]

  

Model:

projects/apps/goods/models.py

from django.db import models


class Goods(models.Model):
    """
    商品
    """
    name = models.CharField(max_length=100, verbose_name="商品名")
    category = models.ForeignKey(GoodsCategory, verbose_name="商品類別", on_delete=models.CASCADE)
    sold_num = models.IntegerField(default=0, verbose_name="商品銷售量")
    fav_num = models.IntegerField(default=0, verbose_name="收藏數")
    goods_num = models.IntegerField(default=0, verbose_name="庫存數")
    price = models.FloatField(default=0, verbose_name="本店價格")

    class Meta:
        verbose_name = ‘商品‘
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name 
$ python manage.py makemigrations goods
$ python manage.py migrate

  

Serialization:

如同Django提供了Form類和ModelForm類一樣,REST framework包括Serializer類和ModelSerializer類.

from rest_framework import serializers
from goods.models import Goods


class GoodsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Goods
        # fields = ("name","sold_num","fav_num","price")
        fields = "__all__"

 上述代碼還存在一個問題,由於category字段是Category表的外鍵,因此此處我們顯示的結果僅僅是Category表中的id,而不是該表的所有字段

解決方法:

class CategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = GoodsCategory
        fields = "__all__"

class GoodsSerializer(serializers.ModelSerializer):
    category = CategorySerializer()
    class Meta:
        model = Goods
        # fields = ("name","sold_num","fav_num","price")
        fields = "__all__"

  如果應用於多對多關系,則應將此參數設置為True,category = CategorySerializer(many=True)

django-rest-framework(serialization)