标题:drf新手教程 | 作者: catfish | 时间:2020年01月17日
暂无法显示图片

我们来看看drf的最基本的使用。这样你简单的使用drf了。

首先让我们素质三连:

django-admin startproject book
cd book
python3 manage.py startapp users
python3 manage.py migrate

这样你就创建好了项目,应用和默认的sqlite3数据库。

我默认你已经安装好了django-rest-framework,如果你没有安装好,请使用pip进行安装。

然后把rest_framework和users在INSTALL_APP中注册:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'users',
]

然后填写models.py文件:

from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils import timezone

class UserProfile(AbstractUser):
    APIkey = models.CharField(max_length=30, verbose_name='APIkey', default='abcdefg')
    money = models.IntegerField(default=10, verbose_name ='余额')
    class Meta:
        verbose_name = '用户'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.username

class Book(models.Model):
    title = models.CharField(max_length=30, verbose_name='书名', default='')
    isbn = models.CharField(max_length=30, verbose_name = 'isbn', default='')
    author = models.CharField(max_length=20, verbose_name="作者", default='')
    publish = models.CharField(max_length=30, verbose_name='出版社', default='')
    rate = models.FloatField(default=0, verbose_name="豆瓣评分")
    add_time = models.DateTimeField(default=timezone.now, verbose_name='添加时间')
    class Meta:
        verbose_name='书籍信息'
        verbose_name_plural = verbose_name
    def __str__(self):
        return self.title

在settings.py中填写以下行:

AUTH_USER_MODEL = 'users.UserProfile'

执行以下命令:

python3 manage.py makemigrations
python3 manage.py migrate

然后创建一个超级用户:

python3 manage.py createsuperuser

超级用户的用户名叫admin,邮箱为1@1.com,然后在模型Book中添加一条数据库记录:title为“一个书名”,isbn为777777,author为“catfish1921”,push为“catfish1921出版社”,rate为6.6。

然后准备工作已经完成,现在开始我们的“正片”。在users目录下新建py文件serializers.py,并写入:

from rest_framework import serializers
from .models import UserProfile, Book

class BookSerializer(serializers.Serializer):
    title = serializers.CharField(required=True, max_length=100)
    isbn = serializers.CharField(required=True, max_length=100)
    author = serializers.CharField(required=True, max_length=100)
    publish = serializers.CharField(required=True, max_length=100)
    rate = serializers.FloatField(default=0)

或者写成如下形式,如下形式更加推荐!

from rest_framwork import serializers
from .models import UserProfile, Book
class BookModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = '__all__'

然后在views.py中编写如下代码:

from .serializers import BookSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import UserProfile, Book

class BookAPIView1(APIView):
    def get(self, request, format=None):
        APIkey = self.request.query_params.get("apikey", 0)  # 等同于 request.GET.get("apikey", 0)
        developer= UserProfile.objects.filter(APIkey=APIkey).first()
        if developer:
            balance = developer.money
            if balance > 0:
                isbn = self.request.query_params.get("isbn", 0)
                books = Book.objects.filter(isbn=int(isbn))
                books_serializer = BookSerializer(books, many=True)
                developer.money -= 1
                developer.save()
                return Response(books_serializer.data)
            else:
                return Response("兄弟,又到了冲钱的时候了,好开心啊")
        else:
            return Response("查无此人啊")

在urls.py文件中配置路由如下:

from django.contrib import admin
from django.urls import path
from users.views import BookAPIView1

urlpatterns = [
    path('admin/', admin.site.urls),
    path('apibook1/', BookAPIView1.as_view(), name="book1"),
]

然后我们访问:http://127.0.0.1:8000/apibook/?apikey=abcdefg&isbn=777777

访问结果为:

[
    {
        'title':'一个书名',
        'isbn': '777777',
        'author': 'catfish1921',
        'publish': '一个出版社',
        'rate': '6.6'
        "add_time" : null
    }
]

注意:这里的add_time为null时因为这个项目使用了Django默认的db.sqlite3数据库,由于db.sqlite3在储存数据时保存时间字段时是以时间戳的格式保存的,所以只接使用Django REST framework的Serializer进行序列化会失败。在实际项目中,我们使用mysql数据库就不会出现这种效果了。

当我们访问10次后会出现:

"兄弟,又到冲钱的时候了,好开心啊!"

对了,最后再补上admin.py文件的写法。其他的自己领悟。

from django.contrib import admin
from users.models import Book, UserProfile
from django.contrib.auth.admin import UserAdmin
from django.utils.translation import gettext_lazy as _

@admin.register(Book)
class BookAdmin(admin.ModelAdmin):
    pass

@admin.register(UserProfile)
class BookAdmin(UserAdmin):
    list_display = ('pk', 'APIkey', 'username', 'email', 'is_staff', 'is_superuser', 'money')
    fieldsets = (
        (None, {'fields': ('username', 'password', 'APIkey','money')}),
        (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
        (_('Permissions'), {'fields': ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')}),
        (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
    )

 

我要评论

没有登录?请先登录后再评论

最新评论

暂无人评论,来抢个沙发吧!