模型类多表操作和中间件

 

class User2(models.Model):
    username = models.CharField(max_length=16)

class News(models.Model):
    topic = models.CharField(max_length=100)
    #to指向一的一方,一对多 ;on_delete外键约束,级联操作;
    #帖子的发送者,一对多的关系
    # 一个User2对象能对应多个News对象,一个News对象只能对应一个User2对象
    sender = models.ForeignKey(to=User2,on_delete=models.CASCADE,related_name='sender_set')
    #帖子的收藏者,多对多的关系,会生成一个中间表用来表示多对多的关系
    #一对多的关系一个User2对象能对应多个News对象,一个News对象也能对应多个User2对象
    collectors = models.ManyToManyField(to=User2,related_name='collectors_set')

class Area(models.Model):
    name = models.CharField(max_length=10)
    pArea = models.ForeignKey(to='self',null=True,on_delete=models.CASCADE)
'''
news.sender 得到帖子的发送者,返回的是User.Object对象
user.sender_set.all() 返回的是QuerySet [<News: News object (1)>,...]
user.sender_set.add(news)       给用户添加一个new对象,相当于添加一个帖子
user.sender_set.remove(news)    给用户删除一个new对象,相当于删除一个帖子

news.collectors.all()    返回的是QuerySet [<User2: User2 object (1)>,...]对象,这个帖子的所有收藏者
user.collectors_set.all() 和上面的正好是相反的,这个是通过该用户获取所收藏的所有帖子,也是QuerySet [<News: News object (1)>,...]
user.collectors_set.add(news) 给用户 添加一个所收藏的帖子
user.collectors_set.remove(news) 给用户 删除一个所收藏的帖子

area.pArea → Area Object   得到的是他的 上级 返回的是 Area Object
area.area_set.all() → QuerySet 没有指明 related_name 属性的值,使用area_set(类名小写然后加上set 来找到多的一方这里是找到所有的下级)

'''

 

1. 定义中间件
from django.utils.deprecation import MiddlewareMixin

class MyMiddleware(MiddlewareMixin):
    def __init__(self,get_response=None):
        super().__init__(get_response)
        # 初始化中间件
        print('init_mymiddleware')

    def process_request(self,request):
        # 没有return或者return None 继续调用其他视图
        # return response 则不会调用其他视图
        print('process_request')


    def process_response(self,request,response):
        # 必须return response
        print('process_response')
        return response



2. 配置中间件
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'middleware.MyMiddleware'
]

数据库的主要分类可以大致分为以下几类: 1. **关系型数据库**:这类数据库基于关系模型,使用格来存储数据,并通过SQL进行查询。常见的关系型数据库包括MySQL、Oracle、PostgreSQLMicrosoft SQL Server等。 2. **非关系型数据库(NoSQL)**:这类数据库不使用传统的格模型,而是采用键值对、文档、列族或图形等不同的数据模型。常见的NoSQL数据库包括MongoDB(文档型)、Redis(键值型)、Cassandra(列族型)Neo4j(图形型)等。 3. **分布式数据库**:这种数据库的设计是为了支持大规模的数据存储高并发访问,数据被分散存储在个物理节点上。例如,Google Spanner Amazon DynamoDB 是典型的分布式数据库。 4. **内存数据库**:这类数据库将数据主要存储在内存中,以提高数据访问速度。例如,Redis Memcached 是常用的内存数据库。 5. **时序数据库**:专门设计用于处理时间序列数据,如物联网设备生成的数据。InfluxDB TimescaleDB 是时序数据库的例子。 6. **对象数据库**:这类数据库直接支持面向对象编程语言中的对象模型,允许开发者以更自然的方式存储检索对象。例如,db4o ObjectDB。 中间件的定义是指位于操作系统应用程序之间的软件层,它提供了一种通信机制服务,使得不同系统之间能够更加容易地进行交互。中间件可以帮助解决异构环境下的数据共享问题,简化分布式系统的开发复杂度,并提高系统的灵活性可扩展性。 关于中间件的分类,根据其提供的服务类型,可以细分为以下几种: - **消息中间件**:这类中间件负责在分布式系统中传递消息,确保信息能够在不同的组件之间可靠传输。常见的消息中间件有RabbitMQ、Apache KafkaActiveMQ等。 - **事务处理中间件**:这类中间件主要用于管理协调分布式事务,确保交易的完整性。Tuxedo BEA Tuxedo 是这类中间件的代。 - **远程过程调用(RPC)中间件**:这类中间件允许一个程序调用另一个地址空间的过程或函数,就像调用本地过程一样。gRPC Apache Thrift 属于此类中间件[^4]。 - **对象请求代理(ORB)中间件**:这类中间件是CORBA标准的一部分,用于支持跨网络的对象通信。CORBA ORBs如OrbixVisiBroker属于此类。 - **Web服务中间件**:这类中间件基于Web服务标准(如SOAP, REST),提供了一种跨平台的服务交互方式。Spring Web Services Apache CXF 是Web服务中间件的例子。 - **数据库中间件**:这类中间件提供数据库连接池、查询优化、读写分离等功能,以增强数据库的性能可管理性。例如,Hibernate、MyCAT TDDL 都是数据库中间件的例子[^1][^3]。 - **应用服务器中间件**:这类中间件提供了运行企业级应用的环境,通常包含Web容器、EJB容器、JMS服务等。Tomcat、JBoss AS WebLogic Server 是这类中间件的代。 - **安全中间件**:这类中间件专注于提供安全相关的服务,如身份验证、授权、加密等。OpenAM Keycloak 是安全中间件的例子。 - **缓存中间件**:这类中间件通过缓存数据来减少数据库访问次数,从而提高系统性能。Redis Memcached 是缓存中间件的典型例子。 - **负载均衡中间件**:这类中间件用于分配工作负载到个计算资源上,以优化资源使用、最大化吞吐量、最小化响应时间。Nginx HAProxy 是负载均衡中间件的例子。 - **API网关中间件**:这类中间件作为系统的前端入口,负责处理所有API请求,进行路由、组合协议转换。Kong Zuul 是API网关中间件的例子。 每种类型的中间件都有其特定的应用场景优势,选择合适的中间件对于构建高效、稳定的分布式系统至关重要。 ```python # 示例代码:简单的Python脚本连接到MySQL数据库并执行查询 import mysql.connector from mysql.connector import Error try: connection = mysql.connector.connect(host='localhost', database='testdb', user='root', password='password') if connection.is_connected(): db_Info = connection.get_server_info() print("Connected to MySQL Server version ", db_Info) cursor = connection.cursor() cursor.execute("select database();") record = cursor.fetchone() print("You're connected to database: ", record) except Error as e: print("Error while connecting to MySQL", e) finally: if (connection.is_connected()): cursor.close() connection.close() print("MySQL connection is closed") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值