• 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. [E2E_L9]Linux命令行上传文件到百度网盘

    百度有2TB 存储空间,在有第三方服务器的情况下,很多东西不需要下载到本地,可以直接使用服务转存,这非常好. 系统环境: Linux 系统 + Python 2.7 安装软件工具:[可能会要重复装] ...

  2. Linux 常用操作和命令

    腾讯云部署 java web 环境:https://blog.csdn.net/niceLiuSir/article/details/78879844 Tomcat部署和配置:https://blog ...

  3. Python之内置装饰器property

    # -*- coding: utf-8 -*- # author:baoshan class Student(object): def __init__(self, name): self.name ...

  4. CefSharp 提示 flash player is out of date 运行此插件 等问题解决办法

    CefSharp 提示 flash player is out of date 或者 需要手动右键点 运行此插件 脚本 等问题解决办法 因为中国版FlashPlayer变得Ad模式之后,只好用旧版本的 ...

  5. matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象

    一起来学matlab-matlab学习笔记9 高级绘图命令_1 图形对象_根对象,轴对象,用户控制对象,用户菜单对象 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matl ...

  6. [LeetCode] 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  7. 当代码上传git时,提示Repository not found The requested repository does not exist, or you do not have permission to access it. fatal: Could not read from remote repository. Please make sure you have the corre

    1.检查当前git中设置的用户名与邮箱是否与自己电脑上的一致. 看这个文件中 如果不一致,只需要把里面的内容全部复制出来添加到git(看下图位置) 这是再执行:git push -u origin m ...

  8. SQL查询无限层级结构的所有下级,所有上级(即所有的子孙曾孙等等)

     表名:tb_menu 内容如下: 查询ID为3的所有无限层下级会员 WITH TAS( SELECT * FROM tb_menu WHERE id=3 UNION ALL SELECT a.* F ...

  9. .Net Core 1.1打包发布到Linux

    在 .Net Core 1.0 中我们打包跨平台包是在 project.json 中配置的 但是 .Net Core 1.1 去掉了 project.json 具体咋办参考:https://blogs ...

  10. jquery on绑定事件叠加解决方法

    jquery on绑定事件叠加解决方法 代码如下 <pre> $('.maoqiu').each(function () { var is_bind = $(this).attr('is_ ...