zoukankan      html  css  js  c++  java
  • drf 05

    1、完成汽车系统表模型的建立(表关系自己设计)
    	汽车表、汽车商家表、赞助商表、赞助商详情表
    
    2、完成汽车系统的接口编写
    	汽车表:八大接口(不需要写put方法)
    	汽车商家表:八大接口(不需要写put方法
    
    """
    related_name反查参数,设置后可以在被关联表中通过该字段反查外键所在表
    on_delete:当该表中的某条数据删除后,关联外键的操作
    CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
    PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
    SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
    SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
    SET(): 自定义一个值,该值当然只能是对应的实体了
    如果使用两个表之间存在关联,首先db_constraint=False 把关联切断,但保留链表查询的功能,其次要设置null=True, 
    blank=True,注意on_delete=models.SET_NULL 一定要置空,这样删了不会影响其他关联的表
    db_table  第三张表的名字
    db_constraint=False,这个就是保留跨表查询的便利(双下划线跨表查询```),但是不用约束字段了,一半公司都用false,
    这样就省的报错,因为没有了约束(Field字段对象,既约束,又建立表与表之间的关系)
    """
    
    # api>urls.py
    from . import views
    from django.conf.urls import url
    
    urlpatterns = [
        url(r'^v1/cars/$',views.CarAPIView.as_view()),
        url(r'^v1/cars/(?P<pk>d+)/$',views.CarAPIView.as_view())
    ]
    
    # ============================================================================================= 
    # views.py
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from .response import APIResponse
    from . import models, serializers
    class CarAPIView(APIView):
        # 群查
        def get(self, request, *args, **kwargs):
            car_query = models.Car.objects.filter(is_delete=False).all()
            car_ser = serializers.CarModelSerializer(instance=car_query, many=True)
            return APIResponse(results=car_ser.data)
    # =============================================================================================  
    # models.py
    # 基表
    class BaseModel(models.Model):
        is_delete = models.BooleanField(default=False)
        create_time = models.DateTimeField(auto_now_add=True)
    
        class Meta:
            abstract=True
    
    # 汽车表
    class Car(BaseModel):
        name = models.CharField(max_length=64,verbose_name = '车名')
        price = models.DecimalField(max_digits=10, decimal_places=2,verbose_name = '价格')
        brand = models.ForeignKey(to='Brand',db_constraint=False,null=True,on_delete=models.SET_NULL)
        sponsors = models.ManyToManyField(to='Sponsor',db_constraint=False)
    
        @property
        def brand_name(self):
            return self.brand.name
    
        @property
        def sponsor_list(self):
            sponsor_list_temp = []
            for sponsor in self.sponsors.all():
                sponsor_dic = {
                    'name': sponsor.name
                }
                try:
                    sponsor_dic['phone'] = sponsor.sponsordetail.phone
                except:
                    sponsor_dic['phone'] = '未知'
                sponsor_list_temp.append(sponsor_dic)
            return sponsor_list_temp
        class Meta:
            verbose_name_plural='汽车'
        def __str__(self):
            return self.name
    # 汽车商家表
    class Brand(BaseModel):
        name = models.CharField(max_length=32)
    
        class Meta:
            verbose_name_plural='汽车品牌'
    
        def __str__(self):
            return self.name
    # 赞助商表
    class Sponsor(BaseModel):
        name = models.CharField(max_length=64)
    
        class Meta:
            verbose_name_plural='赞助商'
    
        def __str__(self):
            return self.name
    # 赞助详情表
    class SponsorDetail(BaseModel):
        phone = models.CharField(max_length=11)
        sponsor = models.OneToOneField(to=Sponsor,db_constraint=False,on_delete=models.CASCADE)
    
        class Meta:
            verbose_name_plural='赞助商详情'
    
        def __str__(self):
            try:  # 连表可能会出现问题,所以要异常处理
                return self.sponsor.name + '的详情'
            except:
                return super().__str__()
     
    # ============================================================================================= 
    # serializers.py
    from rest_framework import serializers
    from . import models
    
    class CarModelSerializer(serializers.ModelSerializer):
        class Meta:
            model=models.Car
            fields = ('name','price','brand_name','sponsor_list','brand','sponsors')
            extra_kwargs = {
                'brand': {
                    'required': True,
                    'write_only': True
                },
                'sponsors': {
                    'required': True,
                    'write_only': True
                },
            }
            
    # ============================================================================================= 
    # response.py
    from rest_framework.response import Response
    class APIResponse(Response):
        def __init__(self, status=0, msg='ok', results=None, http_status=None,
                     headers=None, exception=False, content_type=None, **kwargs):
            # 将status、msg、results、kwargs格式化成data
            data = {
                'status': status,
                'msg': msg,
            }
            # results只要不为空都是数据:False、0、'' 都是数据 => 条件不能写if results
            if results is not None:
                data['results'] = results
            # 将kwargs中额外的k-v数据添加到data中
            data.update(**kwargs)
    
            super().__init__(data=data, status=http_status, headers=headers, exception=exception, content_type=content_type)
    
  • 相关阅读:
    Backtrace stopped: previous frame identical to this frame (corrupt stack?)
    windows 10 无法启动 windows update 服务 错误 0x80070005 拒绝访问
    error LNK2019: 无法解析的外部符号 __imp_recv,该符号在函数 evthread_notify_drain_default 中被引用
    opencv3.1.0 在控制台程序中报错:winnt.h(6464): error C2872: ACCESS_MASK: 不明确的
    使用OCCI操作Oracle数据库写入中文乱码
    fatal error C1010: 在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h""
    清空资源管理器访问过FTP的账号、密码
    Windows系统查看xxx.dll、xxx.lib文件的导出函数、依赖文件等信息的方法
    ConvertBSTRToString导致的内存泄漏
    mxnet.base.MXNetError: src/imperative/./imperative_utils.h:70: Check failed: inputs[i]->ctx().dev_mask() == ctx.dev_mask() (1 vs. 2)
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/12121662.html
Copyright © 2011-2022 走看看