0
点赞
收藏
分享

微信扫一扫

DRF外键操作

香小蕉 2021-09-22 阅读 76
日记本
项目文件夹drf_fk/urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url,include

urlpatterns = [
    path('admin/', admin.site.urls),
    # url(r'^api/', include('app1/urls')),
    url(r'^api/', include('app1.urls')),
]
应用文件夹app1/urls.py
from django.conf.urls import url
from app1 import views

urlpatterns = [
    url(r'^article/$', views.DrfArticle.as_view({'get':'list','post':'create'})),
    url(r'^article/(?P<pk>\d+)/$', views.DrfArticle.as_view(
        {'get':'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),
]
视图views.py
from django.shortcuts import render
from rest_framework import serializers
from app1 import models
from rest_framework.viewsets import ModelViewSet
# Create your views here.

# 有外键的表增删改查(序列化器)
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')
        fields = ['id','title','summary','content','cates','cates_name','status','article_status','tag','tag_info']

    # ### 如果要采用第二种方法,必须按照下面的格式写。
    # 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(ModelViewSet):
    queryset = models.Article.objects.all()
    serializer_class = ArticleSerializer
模块表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,on_delete=models.CASCADE)
    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)
POST插入数值(按照model表的字段插值,而不是序列化器的fields插值,fileds是显示的字段)(tag表和category表原有数值)


成功返回

其他GET,DELETE,UPDATE,PUT,PATCH同理
举报

相关推荐

0 条评论