• models.py
from django.db import models

# Create your models here.
class Category(models.Model):
"""
文章分类
"""
name = models.CharField(verbose_name='分类',max_length=32) class Article(models.Model):
"""
文章表
"""
status_choices = (
(1,'发布'),
(2,'删除'),
)
title = models.CharField(verbose_name='标题',max_length=32)
summary = models.CharField(verbose_name='简介',max_length=255)
content = models.TextField(verbose_name='文章内容')
cates = models.ForeignKey(to='Category',verbose_name="文章类别",null=True,blank=True)
status = models.IntegerField(verbose_name='状态', choices=status_choices, default=1)
tag = models.ManyToManyField(verbose_name='标签', to='Tag', null=True, blank=True) class Tag(models.Model):
"""标签"""
title = models.CharField(verbose_name='标签',max_length=32)
  • Urls.py
from django.conf.urls import url
from django.contrib import admin
from api import views urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^drf/category/$', views.DrfCategoryView.as_view()),
url(r'^drf/category/(?P<pk>\d+)/$', views.DrfCategoryView.as_view()),
url(r'^new/category/$', views.NewDrfCategory.as_view()),
url(r'^new/category/(?P<pk>\d+)/$', views.NewDrfCategory.as_view()),
url(r'^drf/article/$', views.DrfArticle.as_view()),
url(r'^drf/article/(?P<pk>\d+)/$', views.DrfArticle.as_view()),
]
  • Views.py
# 无外键的表进行增删改查

from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from api import models
from django.forms.models import model_to_dict
from rest_framework import serializers class NewCategorySerializer(serializers.ModelSerializer):
class Meta:
model = models.Category
fields = '__all__' class NewDrfCategory(APIView): def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if not pk:
queryset = models.Category.objects.all()
ser = NewCategorySerializer(instance=queryset, many=True)
return Response(ser.data)
else:
queryset = models.Category.objects.filter(id=pk).first()
ser = NewCategorySerializer(instance=queryset, many=False)
return Response(ser.data) def post(self, request, *args, **kwargs):
ser = NewCategorySerializer(data=request.data)
if ser.is_valid(): # 数据校验和modelform类似
ser.save() # 返回值为保存的数据对象;括号里也可以添加键值对,可以指定字段。
return Response('ok')
else:
return Response(ser.errors) def put(self, request, *args, **kwargs):
pk = kwargs.get('pk')
queryset = models.Category.objects.filter(id=pk).first()
ser = NewCategorySerializer(instance=queryset, data=request.data)
if ser.is_valid():
ser.save()
return Response('ok')
else:
return Response(ser.errors) def delete(self, request, *args, **kwargs):
pk = kwargs.get('pk')
models.Category.objects.filter(id=pk).delete()
return Response('ok')
# 有外键的表增删改查

class ArticleSerializer(serializers.ModelSerializer):
### 第一种可以获取外键关联表数据的方法 ####
# 无choices选择的字段
cates_name = serializers.CharField(source='cates.name', required=False) # 有choices选择的字段
article_status = serializers.CharField(source='get_status_display', required=False)
# 名称如果和字段名称一样,会覆盖从数据库中获取的数据;当前端提交数据的时候会出问题,这时可以定义两个类分开进行查询和存储提交的数据。
# required=False:是否需要,False表示在接收添加数据时不会对这个字段进行检查 ### 第二种可以获取外键关联表数据的方法 ####
aa = serializers.SerializerMethodField()
bb = serializers.SerializerMethodField()
tag_info = serializers.SerializerMethodField() class Meta:
model = models.Article
# fields = '__all__' # 包含上面自定义的获取外键的字段
fields = ('id','title','summary','content','cates','cates_name','status','article_status','aa','bb','tag_info')
# depth = 1 # 查询外键关联的表的所有字段数据,数字1表示查询到1层关联表,最大为10. ### 如果要采用第二种方法,必须按照下面的格式写。
def get_aa(self,obj):
return obj.cates.name # 针对有choices选择的字段
def get_bb(self,obj):
return obj.get_status_display() ## 针对ManyToManyField关系的字段
def get_tag_info(self,obj):
tag_list = [{"id":tag_msg.id,"title":tag_msg.title} for tag_msg in obj.tag.all()]
return tag_list class DrfArticle(APIView): def get(self, request, *args, **kwargs):
pk = kwargs.get('pk')
if not pk:
queryset = models.Article.objects.all()
ser = ArticleSerializer(instance=queryset, many=True)
return Response(ser.data)
else:
queryset = models.Article.objects.filter(id=pk).first()
ser = ArticleSerializer(instance=queryset, many=False)
return Response(ser.data) def post(self, request, *args, **kwargs):
ser = ArticleSerializer(data=request.data)
if ser.is_valid():
ser.save()
return Response('ok')
else:
return Response(ser.errors) def put(self, request, *args, **kwargs):
"""
全部更新,需要提交所有字段的数据
:param request:
:param args:
:param kwargs:
:return:
"""
pk = kwargs.get('pk')
queryset = models.Article.objects.filter(id=pk).first()
ser = ArticleSerializer(instance=queryset, data=request.data)
if ser.is_valid():
ser.save()
return Response('ok')
else:
return Response(ser.errors) def patch(self, request, *args, **kwargs):
"""
局部更新,只需要提交需要修改的字段数据即可
:param request:
:param args:
:param kwargs:
:return:
"""
pk = kwargs.get('pk')
queryset = models.Article.objects.filter(id=pk).first()
ser = ArticleSerializer(instance=queryset, data=request.data,partial=True) # partial=True 是否开启局部更新
if ser.is_valid():
ser.save()
return Response('ok')
else:
return Response(ser.errors)

DRF 有无外键操作实例的更多相关文章

  1. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  2. Django(四) ORM 外键操作及初识Ajax

    一.内容回顾 1.Django请求的生命周期: ​ 路由系统 -> 视图函数(获取模板+数据 -> 渲染) -> 字符串返回给用户 2.路由系统: /index/ #-> 函数 ...

  3. DjangoORM外键操作

    Django ORM 外键操作 经常修改的东西一般不放到内存里面,而是放到一张表里.表跟表之间是可以存在关系的,最基本的就是一对多的关系. models.ForeignKey(ColorDic) 1. ...

  4. Django - orm外键操作

    1.orm外键操作 创建外键: 备注:ForeignKey两个参数,1个为关联的表名,1个为关联的字段名: 在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避 ...

  5. djangoORM 修改表结构/字段/外键操作

    Django支持修改表结构 把max_length=64 改为60 再执行一遍 python manage.py makemigrations python manage.py migrate 如果是 ...

  6. django ORM的外键操作

    外键约束示例 #models操作如下 class HostInfo(models.Model): servername = models.CharField(max_length=) serverip ...

  7. mysql 约束和外键约束实例

    1.约束保证数据的完整性和一致性. 2.约束分为表级约束和列级约束.(根据约束所针对的字段的数目的多少来决定) 列级约束:对一个数据列建立的约束 表级约束:对多个数据列建立的约束 列级约束即可以在列定 ...

  8. django中的数据库外键操作

    以MYSQL为例: (1)在model中定义两个数据表,食物信息和食物类别信息 class foodInfo(models.Model):     food_id = models.AutoField ...

  9. django 外键操作

    下面定义两个模型,一个主表,一个字表. 举例说明: 如何通过主表对象找到对应的子表对象? 如何通过子表对象找到对应的主表对象? class Person(models.Model); name = m ...

随机推荐

  1. 如何通过配置tomcat或是web.xml让ie直接下载文件

    web.xml(tomcat\conf\web.xml)中配置了 <mime-mapping>   <extension>txt</extension>   < ...

  2. Laya微信小游戏的动态资源

    版本2.1.1. 由于有4m包限制,所以一般小游戏项目分成主包+远程资源. 现在我新建一个remote目录,该目录下资源不发布到微信小游戏目录下,而是服务器远程加载. 发布时,勾线是否提取本地包 远程 ...

  3. 预测分析建模 Python与R语言实现

    预测分析建模 Python与R语言实现 目录 前言 第1章 分析与数据科学1第2章 广告与促销10第3章 偏好与选择24第4章 购物篮分析31第5章 经济数据分析42第6章 运营管理56第7章 文本分 ...

  4. oracle11G 命令【导库数量对比】

    1.查询用户有哪些表 select * from all_tables where owner='ZJY'; 160 rows selected. 2. 查询总数 select object_type ...

  5. 用Postman做接口测试

    The higher your test coverage, the more flexible and bug-resistant your code will be, and the less t ...

  6. elasticsearch的数据写入流程及优化

    Elasticsearch 写入流程及优化 一. 集群分片设置:ES一旦创建好索引后,就无法调整分片的设置,而在ES中,一个分片实际上对应一个lucene 索引,而lucene索引的读写会占用很多的系 ...

  7. Windows下mysql安装配置问题

    下载最新版的mysql: https://dev.mysql.com/downloads/mysql/ 下载完成后解压打开安装包如下 打开cmd以管理员身份运行(一定要以管理员身份运行) 然后输入命令 ...

  8. Hibernate-validator数据验证

    前言 数据效验工作在开发工作中,是非常重要的,保证数据的正确性,可靠性,安全性.不仅在前端进行效验,还要在后台继续进行效验. 前端做验证只是为了用户体验,比如控制按钮的显示隐藏,单页应用的路由跳转等等 ...

  9. bzoj 4500 矩阵 题解

    题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ ...

  10. 模块 logging random

    模块logging logging模块的主要功能是记录软件调试.操作过程中的各种日志. 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志, ...