公元后 1453 年 [事件] —— 君士坦丁堡的陷落,拜占庭帝国的灭亡

君士坦丁堡与拜占庭

在罗马帝国分裂成西罗马帝国和东罗马帝国即拜占庭帝国之后 (以下简称拜占庭帝国) ,拜占庭帝国一直位于基督教世界的最东边。

千百年以来,拜占庭帝国,是古希腊罗马文明的继承者,其首都君士坦丁堡是欧洲和西亚的贸易中枢,其本身同时也充当着基督教世界东部防线的角色,抵挡着波斯人、突厥人、阿拉伯人和土耳其人等民族的进攻。

基督教世界选择无视君士坦丁堡的陷落

在拥有如此众多关键角色的情况下,拜占庭一步步地被奥斯曼土耳其彻底征服。对于这一过程,整个基督教世界在进行了以保护之名行掠夺之实的臭名昭著的十字军东征运动之后,表现出了空前的冷漠。在军事上依赖拜占庭帝国作为屏障抵御奥斯曼土耳其的奥地利、波兰立陶宛联、俄罗斯,在宗教上和拜占庭相扶相依的天主教宗教中心梵蒂冈,在贸易上对拜占庭绝对依赖的欧洲贸易中心威尼斯都选择了无视拜占庭走向灭亡。

拜占庭最后的君士坦丁保卫战,在人类历史上留下了浓墨重彩的一笔。当奥斯曼土耳其的新式乌拉班大炮轰垮了君士坦丁堡曾无比坚固的城墙之时,拜占庭的贵族、工匠、作家、乞丐等和士兵们一同冲上去堵住缺口,拜占庭皇帝和臣民们之间也不再行君臣之礼,因为在死亡面前,人人平等。这似乎已不再是一场宗教主义、民族主义或国家主义的战争,而是人民们为了自己想要的生活方式而为自由意志战斗的战争。这是人类历史上,类似雅典公民们民主投票决定共同抵御波斯帝国入侵的又一个伟大的悲壮瞬间。

拜占庭帝国灭亡以后,基督教世界被彻底从西亚清除,伊斯兰教世界开始转入欧洲。

君士坦丁堡的世界职能开始被分担

君士坦丁堡陷落后,奥斯曼土耳其帝国只用了 50 年时间便开始围攻奥地利的首都维也纳,奥地利、匈牙利、波兰立陶宛联合王国和俄罗斯因为地理位置的关系被迫成为基督教世界新的前哨。

莫斯科承担了君士坦丁堡东正教中心的职责,转而与伊斯兰教进行对抗。

从亚洲而来的贸易线被奥斯曼帝国彻底切断,贸易中心威尼斯彻底衰落,欧洲赖以生存的香料价格猛涨了 70 多倍。急迫的贸易需求导致葡萄牙开始了探索新的海上贸易航线以取代过去拜占庭的功能。并以此带领世界走向了新的大航海时代。

拜占庭帝国即使灭亡之后,其精神依旧在这个世界激荡起伏

俄罗斯曾宣称自己是拜占庭帝国的继承者,声称这个世界是三个罗马的时代 (罗马帝国的时代、东罗马帝国 (拜占庭帝国) 的时代和俄罗斯的时代) ,并将自己的国徽改成和拜占庭一样的双头鹰。

希腊曾今想攻陷土耳其的首都伊斯坦布尔,并将名字改回成君士坦丁堡,将首度建立在那里,甚至连国家的名称都想改为叫做拜占庭。但是因为一系列对土耳其的军事失败才只好作罢。

拜占庭和罗马与雅典一样,已经成为了人历史中辉煌与伟大的代名词。

[实验] Django 自定义逻辑添加 (通过自定义 manager 管理器实现) (一次性完成多对多表数据的插入)

注意:

本实验是接着 《Django 数据展示(多对多版)》而继续的

正文:

步骤目录:

步骤一:在没有自定义 manager 管理器的情况下尝试一次性完成多对多表数据的插入
1.1 进入相应的 Django 环境
1.2 在没有自定义 manager 管理器的情况下尝试一次性完成多对多表数据的插入
1.3 退出相应的 Django 环境

步骤二:确认要插入的数据和预期的一致(可选)
2.1 创建一个自定义 manager 管理器的类
2.2 进入相应的 Django 环境
2.3 确认要插入的数据和预期的一致
2.4 退出相应的 Django 环境

步骤三:一次性完成多对多表数据的插入
3.1 创建一个自定义 manager 管理器的类
3.2 进入相应的 Django 环境
3.3 一次性完成多对多表数据的插入

具体的操作步骤:

步骤一:在没有自定义 manager 管理器的情况下尝试一次性完成多对多表数据的插入
1.1 进入相应的 Django 环境

>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from user.models import *

1.2 在没有自定义 manager 管理器的情况下尝试一次性完成多对多表数据的插入

>>> Student.objects.create(sname='lili',clazz='Class1',course=('Python','Shell'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/zhumingyu/Code/Django/mtwo/django_env/lib/python3.8/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/zhumingyu/Code/Django/mtwo/django_env/lib/python3.8/site-packages/django/db/models/query.py", line 451, in create
    obj = self.model(**kwargs)
  File "/Users/zhumingyu/Code/Django/mtwo/django_env/lib/python3.8/site-packages/django/db/models/base.py", line 503, in __init__
    raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: Student() got an unexpected keyword argument 'clazz'


补充:
(1)这里数据插入失败
(2)按正常顺序应该是先插入班级 clazz,之后再插入学生 student,之后再插入课程 course,之后再去插入中间表

1.3 退出相应的 Django 环境

>>> quit();

步骤二:确认要插入的数据和预期的一致(可选)
2.1 创建一个自定义 manager 管理器的类

将 mysite/test/models.py 中的以下内容:

......
class Clazz(models.Model):
    cno = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=30)

    def __str__(self):
        return u'Clazz:%s'%self.cname

class Course(models.Model):
    course_no = models.AutoField(primary_key=True)
    course_name = models.CharField(max_length=30)

    def __str__(self):
        return u'Course:%s'%self.course_name

class Student(models.Model):
    sno = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=30)
    cls = models.ForeignKey(Clazz,on_delete=models.CASCADE)
    cour = models.ManyToManyField(Course)

    def __str__(self):
        return u'Student:%s'%self.sname

# Get class object according to class name
def getCls(cname):
    try:
        cls = Clazz.objects.get(cname=cname)
    except Clazz.DoesNotExist:
        cls = Clazz.objects.create(cname=cname)
    return cls

def getCourseList(*coursenames):
    courseList = []

    for cn in coursenames:
        try:
            c = Course.objects.get(course_name=cn)
        except Course.DoesNotExist:
            c = Course.objects.create(course_name=cn)
        courseList.append(c)

    return courseList

def registerStu(sname,cname,*coursenames):
    #1. Get class objects
    cls = getCls(cname)
    #2. Gets the list of course objects
    courseList = getCourseList(*coursenames)
    #3. Insert student table data
    try:
        stu = Student.objects.get(sname=sname)
    except Student.DoesNotExist:
        stu = Student.objects.create(sname=sname,cls=cls)
    #4. Insert intermediate table data
    stu.cour.add(*courseList)

    return True

修改为:

......
from django.db import models
from django.db.models.manager import Manager

# Create your models here.
class Clazz(models.Model):
    cno = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=30)

    def __str__(self):
        return u'Clazz:%s'%self.cname

class Course(models.Model):
    course_no = models.AutoField(primary_key=True)
    course_name = models.CharField(max_length=30)

    def __str__(self):
        return u'Course:%s'%self.course_name

class CustomManager(Manager):
    def create(self, **kwargs):
        print(kwargs)

class Student(models.Model):
    sno = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=30)
    cls = models.ForeignKey(Clazz,on_delete=models.CASCADE)
    cour = models.ManyToManyField(Course)

    objects = CustomManager()

    def __str__(self):
        return u'Student:%s'%self.sname

# Get class object according to class name
def getCls(cname):
    try:
        cls = Clazz.objects.get(cname=cname)
    except Clazz.DoesNotExist:
        cls = Clazz.objects.create(cname=cname)
    return cls

def getCourseList(*coursenames):
    courseList = []

    for cn in coursenames:
        try:
            c = Course.objects.get(course_name=cn)
        except Course.DoesNotExist:
            c = Course.objects.create(course_name=cn)
        courseList.append(c)

    return courseList

def registerStu(sname,cname,*coursenames):
    #1. Get class objects
    cls = getCls(cname)
    #2. Gets the list of course objects
    courseList = getCourseList(*coursenames)
    #3. Insert student table data
    try:
        stu = Student.objects.get(sname=sname)
    except Student.DoesNotExist:
        stu = Student.objects.create(sname=sname,cls=cls)
    #4. Insert intermediate table data
    stu.cour.add(*courseList)

    return True

(补充:这里以添加一个显示自己所有键值对的 CustomManager(Manager) 对象并在 Student 类中使用 objects 调用为例)

2.2 进入相应的 Django 环境

>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from user.models import *

2.3 确认要插入的数据和预期的一致

>>> Student.objects.create(sname='lili',clazz='Class1',course=('Python','Shell'))
{'sname': 'lili', 'clazz': 'Class1', 'course': ('Python', 'Shell')}

2.4 退出相应的 Django 环境

>>> quit();

步骤三:一次性完成多对多表数据的插入
3.1 创建一个自定义 manager 管理器的类

将 mysite/test/models.py 中的以下内容:

......
class Clazz(models.Model):
    cno = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=30)

    def __str__(self):
        return u'Clazz:%s'%self.cname

class Course(models.Model):
    course_no = models.AutoField(primary_key=True)
    course_name = models.CharField(max_length=30)

    def __str__(self):
        return u'Course:%s'%self.course_name

class Student(models.Model):
    sno = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=30)
    cls = models.ForeignKey(Clazz,on_delete=models.CASCADE)
    cour = models.ManyToManyField(Course)

    def __str__(self):
        return u'Student:%s'%self.sname

# Get class object according to class name
def getCls(cname):
    try:
        cls = Clazz.objects.get(cname=cname)
    except Clazz.DoesNotExist:
        cls = Clazz.objects.create(cname=cname)
    return cls

def getCourseList(*coursenames):
    courseList = []

    for cn in coursenames:
        try:
            c = Course.objects.get(course_name=cn)
        except Course.DoesNotExist:
            c = Course.objects.create(course_name=cn)
        courseList.append(c)

    return courseList

def registerStu(sname,cname,*coursenames):
    #1. Get class objects
    cls = getCls(cname)
    #2. Gets the list of course objects
    courseList = getCourseList(*coursenames)
    #3. Insert student table data
    try:
        stu = Student.objects.get(sname=sname)
    except Student.DoesNotExist:
        stu = Student.objects.create(sname=sname,cls=cls)
    #4. Insert intermediate table data
    stu.cour.add(*courseList)

    return True

修改为:

......
class Clazz(models.Model):
    cno = models.AutoField(primary_key=True)
    cname = models.CharField(max_length=30)

    def __str__(self):
        return u'Clazz:%s'%self.cname

class Course(models.Model):
    course_no = models.AutoField(primary_key=True)
    course_name = models.CharField(max_length=30)

    def __str__(self):
        return u'Course:%s'%self.course_name

class CustomManager(Manager):
    #Returns a class object
    def getClsObj(self,cname):
        try:
            cls = Clazz.objects.get(cname=cname)
        except Clazz.DoesNotExist:
            cls = Clazz.objects.create(cname=cname)
        return cls

    def getCourseList(self,*coursenames):
        cList = []
        for cn in coursenames:
            try:
                cour = Course.objects.get(course_name=cn)
            except Course.DoesNotExist:
                cour = Course.objects.create(course_name=cn)
            cList.append(cour)
        return cList

    def  create(self, **kwargs):
         clazz = kwargs.get('cls','')

         #Class information multi storage operation
         clas = self.getClsObj(clazz) 

         #Replace string with object
         #Student.objects.create(sname='',cls=clas)
         kwargs['cls'] = clas

         #Assign a separate value pair of course keys to course
         course = kwargs.pop('cour')

         #Storage operation of student information
         stu = Manager.create(self,**kwargs)

         #Total of the course information in storage
         courseList = self.getCourseList(*course)

         #The middle table of student course is stored in the database. An object or tuple can be unpacked automatically here
         stu.cour.add(*courseList)

class Student(models.Model):
    sno = models.AutoField(primary_key=True)
    sname = models.CharField(max_length=30)
    cls = models.ForeignKey(Clazz,on_delete=models.CASCADE)
    cour = models.ManyToManyField(Course)

    objects = CustomManager()

    def __str__(self):
        return u'Student:%s'%self.sname

# Get class object according to class name
def getCls(cname):
    try:
        cls = Clazz.objects.get(cname=cname)
    except Clazz.DoesNotExist:
        cls = Clazz.objects.create(cname=cname)
    return cls

def getCourseList(*coursenames):
    courseList = []

    for cn in coursenames:
        try:
            c = Course.objects.get(course_name=cn)
        except Course.DoesNotExist:
            c = Course.objects.create(course_name=cn)
        courseList.append(c)

    return courseList

def registerStu(sname,cname,*coursenames):
    #1. Get class objects
    cls = getCls(cname)
    #2. Gets the list of course objects
    courseList = getCourseList(*coursenames)
    #3. Insert student table data
    try:
        stu = Student.objects.get(sname=sname)
    except Student.DoesNotExist:
        stu = Student.objects.create(sname=sname,cls=cls)
    #4. Insert intermediate table data
    stu.cour.add(*courseList)

    return True

(补充:这里以创建一次性完成多对多表数据的插入的 manage 管理器为例)

3.2 进入相应的 Django 环境

(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from user.models import *

3.3 一次性完成多对多表数据的插入

>>> Student.objects.create(sname='lili',cls='Class4',cour=('CSS','JS'))


补充:这里
1) 第一步执行:objects = CustomManager()
2) 第二步执行:def create(self, **kwargs)
3) 第三步执行:clazz = kwargs.get(‘cls’,”),这步的结果是 clazz = ‘Class4’
4) 第四步执行:clas = self.getClsObj(clazz),这步的结果是如果 Class4 在数据库中不存在则插入此条数据,并让 clas = cls
5) 第五步执行:cours = kwargs.pop(‘cour’),这步的结果是 cours = (‘CSS’,’JS’)
6) 第六步执行:stu = Manager.create(self, **kwargs),这步的结果是 stu = Student.objects.create(sname=”,cls=clas)
7) 第七步执行:courseList = self.getCourseList(*course),这步的结果是如果 course 元组里的元素不存在则在数据库里创建,并将所有 course 里的元素放在 courseList 空列表中
8) 第八步执行:stu.cour.add(*courseList),这步的结果是将 courseList 里的元素插入 Student 类的 cour 字段对应的中间表里

[内容] Python3 模块属性的查询

步骤一:进入 Python3 模式

# python3

步骤二:导入要显示所有属性的模块

>>> import types

(补充:这里以导入 types 模块为例)

步骤三:显示模块多所有属性

>>> dir(types)
['BooleanType',
 'BufferType',
 'BuiltinFunctionType',
 'BuiltinMethodType',
 'ClassType',
 'CodeType',
 'ComplexType',
 'DictProxyType',
 'DictType',
 'DictionaryType',
 'EllipsisType',
 'FileType',
 'FloatType',
 'FrameType',
 'FunctionType',
 'GeneratorType',
 'GetSetDescriptorType',
 'InstanceType',
 'IntType',
 'LambdaType',
 'ListType',
 'LongType',
 'MemberDescriptorType',
 'MethodType',
 'ModuleType',
 'NoneType',
 'NotImplementedType',
 'ObjectType',
 'SliceType',
 'StringType',
 'StringTypes',
 'TracebackType',
 'TupleType',
 'TypeType',
 'UnboundMethodType',
 'UnicodeType',
 'XRangeType',
 '__all__',
 '__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '__package__']

(补充:这里以显示 types 模块里的属性为例)

[实验] Django 自定义逻辑删除 (通过自定义 manager 管理器实现) (并非真的删除数据)

注意:

本实验是接着 《Django 通过自定义 manger 管理器进行自定义查询》而继续的

正文:

步骤目录:

步骤一:准备测试数据

步骤二:通过自定义 manager 管理器对某个数据进行单个的逻辑删除
2.1 创建一个自定义 manager 管理器的类
2.2 进入相应的 Django 环境
2.3 通过自定义 manager 管理器查询数据
2.4 通过自定义 manager 管理器逻辑删除第一条数据(将第一条数据的 isdelete=False 修改成 isdelete=True)
2.5 通过自定义 manager 管理器查询删除后的数据

步骤三:通过自定义 manager 管理器对一类数据进行批量的逻辑删除
3.1 创建一个自定义 manager 管理器的类
3.2 进入相应的 Django 环境
3.3 查看所有 isdelete=False 的数据
3.4 通过自定义 manager 管理器对一类数据进行批量的逻辑删除(将所有 isdelete=False 的数据修改成 isdelete=True)
3.5 查看所有 isdelete=False 的数据
3.6 查看所有 isdelete=True 的数据

具体的操作步骤:

步骤一:准备测试数据

[root@mariadb ~]# mysql -uroot -p
MariaDB [(none)]> use test;
MariaDB [test]> update test_student SET isdelete=0 WHERE test_student.isdelete=1;
MariaDB [test]> quit;

步骤二:通过自定义 manager 管理器对某个数据进行单个的逻辑删除
2.1 创建一个自定义 manager 管理器的类

将 mysite/test/models.py 中的以下内容:

......
from django.db.models.manager import Manager

class CustomManager(Manager):
    def all(self):
        return Manager.all(self).filter(isdelete=True)

class NotDeletedManager(Manager):
    def all(self):
        return Manager.all(self).filter(isdelete=False)

class Student(models.Model):
    sname = models.CharField(max_length=30)
    isdelete = models.BooleanField(default=False)

    objects = CustomManager()

    show = NotDeletedManager()

    def __str__(self):
        return u'student:%s'%self.isdelete
......

修改为:

......
from django.db.models.manager import Manager

class CustomManager(Manager):
    #def all(self):
    #    return Manager.all(self).filter(isdelete=True)

    def get_queryset(self):
        return Manager.get_queryset(self).filter(isdelete=True)

class NotDeletedManager(Manager):
    def all(self):
        return Manager.all(self).filter(isdelete=False)

class Student(models.Model):
    sname = models.CharField(max_length=30)
    isdelete = models.BooleanField(default=False)

    #objects = CustomManager()

    #show = NotDeletedManager()

    def __str__(self):
        return u'student:%s'%self.isdelete

    def delete(self, using=None, keep_parents=False):
        self.isdelete = True
        self.save()

......

(补充:这里以将 delete 重写成将 isdelete 设置为 True 为例)

2.2 进入相应的 Django 环境

(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *

2.3 通过自定义 manager 管理器查询数据

>>> Student.objects.all()
<QuerySet [<Student: student:False>, <Student: student:False>, <Student: student:False>]>

2.4 通过自定义 manager 管理器逻辑删除第一条数据(将第一条数据的 isdelete=False 修改成 isdelete=True)

>>> Student.objects.first().delete()

2.5 通过自定义 manager 管理器查询删除后的数据

>>> Student.objects.all()
<QuerySet [<Student: student:True>, <Student: student:False>, <Student: student:False>]>

(补充:这里第一条数据 isdelete=True)

步骤三:通过自定义 manager 管理器对一类数据进行批量的逻辑删除
3.1 创建一个自定义 manager 管理器的类

将 mysite/test/models.py 中的以下内容:

......
from django.db.models.manager import Manager

class CustomManager(Manager):
    #def all(self):
    #    return Manager.all(self).filter(isdelete=True)

    def get_queryset(self):
        return Manager.get_queryset(self).filter(isdelete=True)

class NotDeletedManager(Manager):
    def all(self):
        return Manager.all(self).filter(isdelete=False)
   
class Student(models.Model):
    sname = models.CharField(max_length=30)
    isdelete = models.BooleanField(default=False)

    #objects = CustomManager()

    #show = NotDeletedManager()

    def __str__(self):
        return u'student:%s'%self.isdelete

    def delete(self, using=None, keep_parents=False):
        self.isdelete = True
        self.save()

......

修改为:

......
from django.db.models.manager import Manager

class CustomManager(Manager):
    #def all(self):
    #    return Manager.all(self).filter(isdelete=True)

    def get_queryset(self):
        return Manager.get_queryset(self).filter(isdelete=True)

class DeletedManager(Manager):
    def all(self):
        return Manager.all(self).filter(isdelete=True)
   
class BatchDelManager(Manager):
    def get_queryset(self):
        return Manager.get_queryset(self).filter(isdelete=False)

    def filter(self, *args, **kwargs):
        #1. Get the record that needs to be deleted
        delList = Manager.get_queryset(self)

        #2. Define the closure method to modify isdelete = true
        def delete1(delqueryset):
            for dq in delqueryset:
                dq.isdelete = True
                dq.save()
        #3. Create an instance method dynamically, declare that delete has a delete method, call interface is delete (delist), call the delete1 object to execute
        import types
        delList.delete = types.MethodType(delete1,delList)

        return delList

class Student(models.Model):
    sname = models.CharField(max_length=30)
    isdelete = models.BooleanField(default=False)

    objects = BatchDelManager()

    show = DeletedManager()

    def __str__(self):
        return u'student:%s'%self.isdelete

    def delete(self, using=None, keep_parents=False):
        self.isdelete = True
        self.save()

......


补充:
1) 这里以添加一个将父类的 all 重写成将所有 isdelete=True 的数据修改成 isdelete=False 的 BatchDelManager(Manager) 对象并在 Student 类中使用 objects 调用为例
2) 这里的实现方法是:动态创建一个实例方法,对外声明 delete 有一个 delete 方法调用接口是 delete(deList) ,调用 delete1 对象进行执行
3) 这里的 DeletedManager(Manager) 会查看所有 isdelete=True 的数据,并通过 Student 类中的 show 调用
4) 只要子类重写了父类的方法,就不会掉用父类的方法了,而是调用子类的方法
5) 闭包的作用是内部执行一个结果,对外还是一个外部函数的一个调用
6) python2 使用是 new 模块的 instancemethod 属性实现此功能,而 python3 使用是 types 模块的 MethodType属性实现此功能

3.2 进入相应的 Django 环境

(django_env) [root@python mysite]# python3
>>> import os,django
>>> os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
'mysite.settings'
>>> django.setup()
>>> from test.models import *

3.3 查看所有 isdelete=False 的数据

>>> Student.objects.all()
<QuerySet [<Student: student:False>, <Student: student:False>]>

(补充:这里的 objects 已经经过了重写,所以只能显示 isdelete=False 的数据)

3.4 通过自定义 manager 管理器对一类数据进行批量的逻辑删除(将所有 isdelete=False 的数据修改成 isdelete=True)

>>> Student.objects.filter().delete()

3.5 查看所有 isdelete=False 的数据

>>> Student.objects.all()
<QuerySet []>

(补充:此时已经没有 isdelete=False 的数据)

3.6 查看所有 isdelete=True 的数据

>>> Student.show.all()
<QuerySet [<Student: student:True>, <Student: student:True>, <Student: student:True>]>