matchbox是google cloud firestore的orm包

matchbox-orm的Python项目详细描述


火柴盒


DetailsMatchbox is orm package for Google Firestore.
Repositoryhttps://github.com/gameboy86/matchbox
AuthorMaciej Gębarski (https://github.com/gameboy86)
Contactmgebarski@gmail.com
LicenseMIT License
Version0.2

详细信息

Matchbox是google firestore的python对象关系映射器。 它正在开发中。

安装

 pip install matchbox-orm

用法

连接到Firestore

更多信息,如何生成带有私钥的json文件,您可以在Get started with Cloud Firestore

frommatchboximportdatabasedatabase.db_initialization('path/to/serviceAccount.json')

型号

创建

frommatchboximportmodelsclassTest(models.Model):age=models.IntegerField()name=models.TextField()def__unicode__(self):returnself.id
>>t=Test()>>print(t)<Test:e7aad1ec1aa449d2b53b7ca8f2853ea0>

默认情况下,所有字段都是必需的(除了IDFieldReferenceField)。 可以使用属性blankdefault更改此行为。

如果我们现在保存模型,我们将得到:

>>t.save()AttributeError:Fieldagerequiredvalue>>t.age=18>>t.save()AttributeError:Fieldnamerequiredvalue>>t.name='Name'>>t.save()

创建模型的另一种方法是使用managercreate方法:

>>Test.objects.create(name='Test',age=29)<Test:33eba5fd53244e38aa1b4951f104ec3c>

默认情况下,数据库中的集合名称将基于模型名称创建。如果你 要更改它,可以使用meta。例如:

frommatchboximportmodelsclassTest(models.Model):age=models.IntegerField()name=models.TextField()classMeta:collection_name='TestCollection'def__unicode__(self):returnself.id
>>Test._meta.collection_name'TestCollection'

更新

文档可以通过两种方式更新:重写或更新。 下面的示例将覆盖整个文档:

>>t=Test.objects.get(id='eba5fd53244e38aa1b4951f104ec3c')>>t.age=53>>t.save()

如果我们只想更新特定的字段,可以在 save方法:

>>t=Test.objects.get(id='eba5fd53244e38aa1b4951f104ec3c')>>t.age=32>>t.save(update_fields=['age'])

字段

可用字段:

  • idfield
  • 整数域
  • 文本字段
  • 时间戳字段
  • 布尔字段
  • 列表字段
  • 地图字段
  • 地质点场
  • 参考字段

属性

所有字段的可用属性:

  • 空白(如果为真,空白字段将在数据库中保存空值)
  • 默认值(如果字段为空,则在保存时将使用默认值)
  • 列名(数据库中字段的名称。如果为空,将使用字段名称)

TextField接受更多属性max-length

classTest2(models.Model):age=models.IntegerField(default=25)name=models.TextField(blank=True)
>>t=Test2()>>t.save()>>t=Test2.objects.get(id=t.id)>>print(t.age,t.name)25None

idfield

IDField由orm自动创建。我们can't添加自己的,因为firestore没有 允许自己命名的id字段。

>>t._meta.fields{'age':<matchbox.models.fields.IntegerFieldat0x111723f98>,'name':<matchbox.models.fields.TextFieldat0x111723b70>,'id':<matchbox.models.fields.IDFieldat0x1117232b0>}

如果需要,您可以指定自己的ID:

>>t=Test(age=33,name='test',id='My OWN ID')>>t.save()>>t.id'My OWN ID'

如果更改id并保存,将在firestore中创建新文档。

时间戳字段

classTimeStampFieldExample(models.Model):datetimestamp=models.TimeStampField()def__unicode__(self):returnself.id
>>TimeStampFieldExample.objects.create(datetimestamp=datetime.datetime.now())<TimeStampFieldExample:xp4LHczLwzcpC8Q4yF5s>>>list(TimeStampFieldExample.objects.filter(datetimestamp__lte=datetime.datetime.now()))[<TimeStampFieldExample:xp4LHczLwzcpC8Q4yF5s>]>>TimeStampFieldExample.objects.filter(datetimestamp__lte=datetime.datetime.now()).get().datetimestampdatetime.datetime(2019,5,4,16,42,34,583953,tzinfo=datetime.timezone(datetime.timedelta(0),'+00:00'))

列表字段

classListFieldExample(models.Model):list_f=models.ListField()def__unicode__(self):returnself.id
>>ListFieldExample.objects.create(list_f=[1,2,3,4,5])>>list(ListFieldExample.objects.filter(list_f__contains=5))[<ListFieldExample:vZvDWm2EG6Di1wm85uD8>]>>ListFieldExample.objects.filter(list_f__contains=5).get().list_f[1,2,3,4,5]

映射字段

classMapFieldExample(models.Model):map_f=models.MapField()def__unicode__(self):returnself.id
>>MapFieldExample.objects.create(map_f={'a':1,'b':2,'c':{'a':1}})<MapFieldExample:JVggchyQn19knDfx2SNX>>>list(MapFieldExample.objects.filter(map_f__c__a=1))[<MapFieldExample:JVggchyQn19knDfx2SNX>]>>list(MapFieldExample.objects.filter(map_f__c__a=1))[0].map_f{'b':2,'c':{'a':1},'a':1}

地质点场

要保存地质点数据,必须使用类GeoPointValue

classGeoPointFieldExample(models.Model):geo_point_f=models.GeoPointField()def__unicode__(self):returnself.id
>>gpf=GeoPointFieldExample()>>gpf.geo_point_f=GeoPointValue(latitude=52.2297,longitude=21.0122)>>gpf.save()>>list(GeoPointFieldExample.objects.all())[0].geo_point_f<matchbox.models.utils.GeoPointValueat0x11191da58>>>list(GeoPointFieldExample.objects.all())[0].geo_point_f.latitude52.2297

参考字段

firestore提供的一个字段是reference。在一个文档中可以存储 引用其他文档。

classUser(models.Model):name=models.TextField()def__unicode__(self):returnself.idclassClass(models.Model):name=models.TextField()user=models.ReferenceField(User)def__unicode__(self):returnself.id
>>u=User.objects.create(name='Alex')>>c=Class.objects.create(name='A1',user=u)>>c.user<User:cdda43cf3d65413f9eea17349e8222b8>>>c.user.id,c.user.name('cdda43cf3d65413f9eea17349e8222b8','Alex')

查询

对象。获取
classUser(models.Model):name=models.TextField()def__unicode__(self):returnself.id
>>u=User.objects.create(name='Alex')>>User.objects.get(id=u.id)<User:fe500b4bc341471fa3118854b705c674>
对象。全部

返回集合中的所有文档

classUser(models.Model):name=models.TextField()def__unicode__(self):returnself.idclassClass(models.Model):name=models.TextField()user=models.ReferenceField(User)def__unicode__(self):returnself.id
>>User.objects.create(name='Tom')>>User.objects.create(name='Alex')>>User.objects.create(name='Michael')>>User.objects.all()<matchbox.queries.queries.FilterQueryat0x1116a3978>>>list(User.objects.all())[<User:6b8e2190ebe3428e8c30433e74287639>,<User:96767fdc81ba48779683868d2a81cbba>,<User:fe500b4bc341471fa3118854b705c674>]
对象.过滤器

滤波器基于django滤波方法。Firestore允许进行以下比较, 与映射到:

FireStoreMatchbox
^{}lt
^{}lte
^{}gt
^{}gte
^{}not need
^{}contains
classUser(models.Model):name=models.TextField()evaluations=models.ListField()age=models.IntegerField(default=20)def__unicode__(self):returnself.id
>>User.objects.create(name='Tom',evaluations=[1,1,2],age=15)>>User.objects.create(name='Michael',evaluations=[2,3,5])>>User.objects.create(name='Michael',evaluations=[4,4,2])>>User.objects.filter()[<User:2dce37628c4345b0a9d1a721265984b4>,<User:348bf6888d1e4d22afd29385f8c1a330>,<User:389ac1ca88614d5fa5e53facb1249576>]>>User.objects.filter(age__gte=10,age__lte=15)[<User:348bf6888d1e4d22afd29385f8c1a330>]>>u=User.objects.filter(age__gte=10,age__lte=15).get()>>print(u.age)15>>list(User.objects.filter(name='Michael'))[<User:2dce37628c4345b0a9d1a721265984b4>,<User:389ac1ca88614d5fa5e53facb1249576>]>>list(User.objects.filter(name='Michael').filter(evaluations=[4,4,2]))# or list(User.objects.filter(name='Michael', evaluations=[4,4,2]))[<User:2dce37628c4345b0a9d1a721265984b4>]>>u=User.objects.filter(name='Michael',evaluations=[4,4,2]).get()>>print(u.id,u.age,u.name,u.evaluations)2dce37628c4345b0a9d1a721265984b420Michael[4,4,2]>>list(User.objects.filter(evaluations__contains=3))[<User:389ac1ca88614d5fa5e53facb1249576>]>>u=User.objects.filter(evaluations__contains=3).get()>>u.id,u.name,u.evaluations('389ac1ca88614d5fa5e53facb1249576','Michael',[2,3,5])

您还可以按referencefield进行筛选

classClass(models.Model):name=models.TextField()user=models.ReferenceField(User)def__unicode__(self):returnself.id
>>c=Class.objects.create(name='A1',user=User.objects.all().get())>>c.user.id,c.user.name'2dce37628c4345b0a9d1a721265984b4','Michael'>>Class.objects.filter(user=u).get()<Class:c3728ca35d25414794f6071d3acb3e2b>

order_bylimit

>>[(u.age,u.name)foruinUser.objects.all()][(20,'Michael'),(15,'Tom'),(20,'Michael')]>>[(u.age,u.name)foruinUser.objects.all().order_by('age')][(15,'Tom'),(20,'Michael'),(20,'Michael')]>>[(u.age,u.name)foruinUser.objects.all().order_by('-age')][(20,'Michael'),(20,'Michael'),(15,'Tom')]>>[(u.age,u.name)foruinUser.objects.all().order_by('-age').limit(2)][(20,'Michael'),(20,'Michael')]

删除

我们可以通过实例或过滤器删除文档。

>>u=User.objects.all().get()>>u.delete()>>User.objects.filter(name='Alex').delete()

删除整个收藏:

>>User.objects.delete()or>>User.objects.filter().delete()

经理

就像在django中一样,我们可以创建自己的Managers。例如:

classUser(models.Model):name=models.TextField()evaluations=models.ListField()age=models.IntegerField(default=20)def__unicode__(self):returnself.idclassAManager(models.Manager):defget_queryset(self):returnsuper().get_queryset().filter(active=True)classDManager(models.Manager):defget_queryset(self):returnsuper().get_queryset().filter(active=False)classClass(models.Model):name=models.TextField()user=models.ReferenceField(User)active=models.BooleanField()a_objects=AManager()f_objects=DManager()def__unicode__(self):returnself.id
>>c1=Class.objects.create(active=True,name='DD21')>>c2=Class.objects.create(active=True,name='DD22')>>c3=Class.objects.create(active=False,name='CC22')>>c4=Class.objects.create(active=False,name='CC11')>>list(Class.objects.all())[<Class:96Ww50qJVh53v46iyOPP>,<Class:cjGlGWM8RiJqcAQLGvXK>,<Class:pgvWsXY47GrYO4Eiyp2W>,<Class:vHZMVjda2wNEVDmoxTe2>]>>list(Class.f_objects.all())[<Class:pgvWsXY47GrYO4Eiyp2W>,<Class:vHZMVjda2wNEVDmoxTe2>]>>list(Class.a_objects.all())[<Class:96Ww50qJVh53v46iyOPP>,<Class:cjGlGWM8RiJqcAQLGvXK>]

抽象模型

当您想将一些公共信息放入其他模型时,抽象模型非常有用。 必须创建基类并在元模型类中添加abstract=true。

例如:

frommatchboximportmodelsasfsm,databasefromdatetimeimportdatetimedatabase.db_initialization('xxx.json')classSuffixFsm(fsm.Model):createdAt=fsm.TimeStampField()createdBy=fsm.TextField(max_length=30,default='')classMeta:abstract=TrueclassSystemMaster(SuffixFsm):systemName=fsm.TextField(max_length=50,default='')
>>master=SystemMaster(systemName='name',createdAt=datetime.now(),createdBy='test',)>>master.save()>>master.__dict__{'id':'9ZCOPU8KRwUB4rRVF1kZ','systemName':'name','createdAt':datetime.datetime(2019,7,4,21,36,56,472744),'createdBy':'test'}

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何在JAVA中使用带有compareTo的双分派?   java Android应用程序在更改方向时崩溃   java如何使用Spring security将经过身份验证的用户的ip地址保存到DB?   java每隔一段时间检查文件,直到超时值过期   Linux中的Java弹出触发器   java使用LDAP对特定请求的凭据进行身份验证   java如何在intellij中运行spring启动应用程序?   java测试不读取属性文件的值   以矩阵格式java打印2d数组   如何在Java中将无效的JSON字符串转换为JSONObject?   使用CompletableFuture在Java中使用多线程基本WebCrawler返回emptyresponse   java POM,用于压缩项目