• models.py
  1. from django.db import models
  2. # Create your models here.
  3. class Category(models.Model):
  4. """
  5. 文章分类
  6. """
  7. name = models.CharField(verbose_name='分类',max_length=32)
  8. class Article(models.Model):
  9. """
  10. 文章表
  11. """
  12. status_choices = (
  13. (1,'发布'),
  14. (2,'删除'),
  15. )
  16. title = models.CharField(verbose_name='标题',max_length=32)
  17. summary = models.CharField(verbose_name='简介',max_length=255)
  18. content = models.TextField(verbose_name='文章内容')
  19. cates = models.ForeignKey(to='Category',verbose_name="文章类别",null=True,blank=True)
  20. status = models.IntegerField(verbose_name='状态', choices=status_choices, default=1)
  21. tag = models.ManyToManyField(verbose_name='标签', to='Tag', null=True, blank=True)
  22. class Tag(models.Model):
  23. """标签"""
  24. title = models.CharField(verbose_name='标签',max_length=32)
  • Urls.py
  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from api import views
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^drf/category/$', views.DrfCategoryView.as_view()),
  7. url(r'^drf/category/(?P<pk>\d+)/$', views.DrfCategoryView.as_view()),
  8. url(r'^new/category/$', views.NewDrfCategory.as_view()),
  9. url(r'^new/category/(?P<pk>\d+)/$', views.NewDrfCategory.as_view()),
  10. url(r'^drf/article/$', views.DrfArticle.as_view()),
  11. url(r'^drf/article/(?P<pk>\d+)/$', views.DrfArticle.as_view()),
  12. ]
  • Views.py
  1. # 无外键的表进行增删改查
  2. from django.shortcuts import render
  3. from rest_framework.views import APIView
  4. from rest_framework.response import Response
  5. from api import models
  6. from django.forms.models import model_to_dict
  7. from rest_framework import serializers
  8. class NewCategorySerializer(serializers.ModelSerializer):
  9. class Meta:
  10. model = models.Category
  11. fields = '__all__'
  12. class NewDrfCategory(APIView):
  13. def get(self, request, *args, **kwargs):
  14. pk = kwargs.get('pk')
  15. if not pk:
  16. queryset = models.Category.objects.all()
  17. ser = NewCategorySerializer(instance=queryset, many=True)
  18. return Response(ser.data)
  19. else:
  20. queryset = models.Category.objects.filter(id=pk).first()
  21. ser = NewCategorySerializer(instance=queryset, many=False)
  22. return Response(ser.data)
  23. def post(self, request, *args, **kwargs):
  24. ser = NewCategorySerializer(data=request.data)
  25. if ser.is_valid(): # 数据校验和modelform类似
  26. ser.save() # 返回值为保存的数据对象;括号里也可以添加键值对,可以指定字段。
  27. return Response('ok')
  28. else:
  29. return Response(ser.errors)
  30. def put(self, request, *args, **kwargs):
  31. pk = kwargs.get('pk')
  32. queryset = models.Category.objects.filter(id=pk).first()
  33. ser = NewCategorySerializer(instance=queryset, data=request.data)
  34. if ser.is_valid():
  35. ser.save()
  36. return Response('ok')
  37. else:
  38. return Response(ser.errors)
  39. def delete(self, request, *args, **kwargs):
  40. pk = kwargs.get('pk')
  41. models.Category.objects.filter(id=pk).delete()
  42. return Response('ok')
  1. # 有外键的表增删改查
  2. class ArticleSerializer(serializers.ModelSerializer):
  3. ### 第一种可以获取外键关联表数据的方法 ####
  4. # 无choices选择的字段
  5. cates_name = serializers.CharField(source='cates.name', required=False)
  6. # 有choices选择的字段
  7. article_status = serializers.CharField(source='get_status_display', required=False)
  8. # 名称如果和字段名称一样,会覆盖从数据库中获取的数据;当前端提交数据的时候会出问题,这时可以定义两个类分开进行查询和存储提交的数据。
  9. # required=False:是否需要,False表示在接收添加数据时不会对这个字段进行检查
  10. ### 第二种可以获取外键关联表数据的方法 ####
  11. aa = serializers.SerializerMethodField()
  12. bb = serializers.SerializerMethodField()
  13. tag_info = serializers.SerializerMethodField()
  14. class Meta:
  15. model = models.Article
  16. # fields = '__all__' # 包含上面自定义的获取外键的字段
  17. fields = ('id','title','summary','content','cates','cates_name','status','article_status','aa','bb','tag_info')
  18. # depth = 1 # 查询外键关联的表的所有字段数据,数字1表示查询到1层关联表,最大为10.
  19. ### 如果要采用第二种方法,必须按照下面的格式写。
  20. def get_aa(self,obj):
  21. return obj.cates.name
  22. # 针对有choices选择的字段
  23. def get_bb(self,obj):
  24. return obj.get_status_display()
  25. ## 针对ManyToManyField关系的字段
  26. def get_tag_info(self,obj):
  27. tag_list = [{"id":tag_msg.id,"title":tag_msg.title} for tag_msg in obj.tag.all()]
  28. return tag_list
  29. class DrfArticle(APIView):
  30. def get(self, request, *args, **kwargs):
  31. pk = kwargs.get('pk')
  32. if not pk:
  33. queryset = models.Article.objects.all()
  34. ser = ArticleSerializer(instance=queryset, many=True)
  35. return Response(ser.data)
  36. else:
  37. queryset = models.Article.objects.filter(id=pk).first()
  38. ser = ArticleSerializer(instance=queryset, many=False)
  39. return Response(ser.data)
  40. def post(self, request, *args, **kwargs):
  41. ser = ArticleSerializer(data=request.data)
  42. if ser.is_valid():
  43. ser.save()
  44. return Response('ok')
  45. else:
  46. return Response(ser.errors)
  47. def put(self, request, *args, **kwargs):
  48. """
  49. 全部更新,需要提交所有字段的数据
  50. :param request:
  51. :param args:
  52. :param kwargs:
  53. :return:
  54. """
  55. pk = kwargs.get('pk')
  56. queryset = models.Article.objects.filter(id=pk).first()
  57. ser = ArticleSerializer(instance=queryset, data=request.data)
  58. if ser.is_valid():
  59. ser.save()
  60. return Response('ok')
  61. else:
  62. return Response(ser.errors)
  63. def patch(self, request, *args, **kwargs):
  64. """
  65. 局部更新,只需要提交需要修改的字段数据即可
  66. :param request:
  67. :param args:
  68. :param kwargs:
  69. :return:
  70. """
  71. pk = kwargs.get('pk')
  72. queryset = models.Article.objects.filter(id=pk).first()
  73. ser = ArticleSerializer(instance=queryset, data=request.data,partial=True) # partial=True 是否开启局部更新
  74. if ser.is_valid():
  75. ser.save()
  76. return Response('ok')
  77. else:
  78. 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. 备份数据库的shell

    #!/bin/bash #定义备份数据库名 dbname=yourdbname #定义备份数据库的用户名和密码 dbuser=yourdbuser dbpasswd=yourdbpasswd #数据库 ...

  2. (二)limit的高级用法

    一.取出前n条数据 ; 二.取出第几行到第几行的数据 ,; 解释:取出从第3行(从0行开始)开始的5条记录.

  3. [LeetCode] 387. First Unique Character in a String 字符串的第一个唯一字符

    Given a string, find the first non-repeating character in it and return it's index. If it doesn't ex ...

  4. 面试之leetcode20堆栈-字符串括号匹配,队列实现栈

    1 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合.左括号必须以正确的顺序闭合.注意空字符串可被认 ...

  5. ENSP静态链路聚合实验配置要点及实例

    链路聚合分为:静态链路聚合.动态链路聚合链路聚合的负载分担模式:对于二层数据流,系统会根据MAC地址(源mac地址和目的mac地址来计算),而对于三层数据流则会根据ip地址来进行负载分担计算. 静态链 ...

  6. LeetCode 506. 相对名次(Relative Ranks) 39

    506. 相对名次 506. Relative Ranks 题目描述 给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌.前三名运动员将会被分别授予"金牌",&qu ...

  7. [转帖]Socat 入门教程

    https://www.hi-linux.com/posts/61543.html 现在安装k8s 必须带 socat 今天看一下socat 到底是啥东西呢. Socat 是 Linux 下的一个多功 ...

  8. flask框架(八)—自定义命令flask-script、多app应用、wtforms表单验证、SQLAIchemy

    自定义命令flask-script 用于实现类似于django中 python3 manage.py runserver ...类似的命令,用命令行启动项目 首先安装:pip3 install fla ...

  9. Select与Epoll的区别

      相同点: 都是IO多路转接,都是一个线程能同一时间等待一堆描述符 不同点: 1.select接口使用不方便,每次调用完select都需要重新设置fd_set,因为输入输出未分离,返回的fd_set ...

  10. max_prepared_stmt_count参数

    MySQL报错[mysqld-5.5.17-log]Can't create more than max_prepared_stmt_count statements (current value: ...