Rest Framework:三、HyperlinkedidentityField用法

 一、HyperlinkedIdentityField(用的很少)

环境配置:

1、使django支持mysql(不再介绍)

2、settings.py文件INSTALLED_APPS字段中添加"rest_framework"

urls.py

url(r'^books/', views.Books.as_view()),
url(r'^publish/(?P<pk>\d+)', views.Publish.as_view(),name='ttt'),

app01/server.py

from rest_framework import serializers

class AuthorSerializer(serializers.Serializer):
    nid = serializers.CharField()
    name = serializers.CharField()
    age = serializers.CharField()

class BookSerializer(serializers.Serializer):
    name = serializers.CharField()
    # publish = serializers.CharField()
    # 把名字换成链接地址,# view_name:路由的别名 # lookup_field:根据表指定字段,来拼路径,生成链接 # lookup_url_kwarg:默认是pk,(urls.py中的 publish/(?P<pk>\d+),指定的pk)可以不写,反向解析有名分组的名字。
    publish = serializers.HyperlinkedIdentityField(view_name='ttt',lookup_field='publish_id',lookup_url_kwarg='pk')

views.py

from django.shortcuts import HttpResponse,render
from rest_framework.views import APIView
from django.http import JsonResponse
from app01 import models
from app01.server import BookSerializer
# Create your views here.
class Books(APIView):
    def get(self,request,*args,**kwargs):
        ret=models.Book.objects.all()
        book_ser=BookSerializer(ret,many=True,context={'request':request})
        print(book_ser.data)
        return JsonResponse(book_ser.data,safe=False)
class Publish(APIView):
    def get(self,request,*args,**kwargs):
        return HttpResponse('ok')

models.py

from django.db import models
# Create your models here.
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField()
    # 外键对应数据库表中的字段名后面会自动加"_id"        # on_delete=models.CASCADE 级联删除
    publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
    # ManyToManyField 自动创建第三张表,本表名_到你对应多的表名名字,自动帮你把表名转小写
    authors = models.ManyToManyField(to='Author')
    def __str__(self):
        return self.name
class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    author_detail = models.OneToOneField(to='AuthorDatail', to_field='nid', unique=True, on_delete=models.CASCADE)

class AuthorDatail(models.Model):
    nid = models.AutoField(primary_key=True)
    telephone = models.BigIntegerField()
    birthday = models.DateField()
    addr = models.CharField(max_length=64)

class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()
    def __str__(self):
        return self.name
    def test(self):
        return self.email

最后使用:

python3 manage makemigrations
python3 manage migrate

使用postman验证:

image.png

总结:

-1 publish = serializers.HyperlinkedIdentityField(view_name='ttt',lookup_field='publish_id',lookup_url_kwarg='pky')

-2 view_name:路由的别名,lookup_field:根据表的哪个字段,来拼路径,lookup_url_kwarg:反向解析有名分组的名字

-3 写路由:url(r'^publish/(?P<pky>\d+)', views.Publish.as_view(),name='ttt'),

-4 实例化序列化类的时候,需要把request对象传过去

book_ser=BookSerializer(ret,many=True,context={'request': request})


猜你喜欢

转载自blog.51cto.com/silencezone/2330937