我使用的是Redis Object Mapper(ROM)here。
这是我的模特
class User(rom.Model):
name = rom.String(required=True, unique=True)
nickname = rom.String(required=False)
photo = rom.String(required=False)
我正在尝试 -
user1 = User(name="Ankush", nickname="iamkhush",
photo='http://graph.facebook.com/iamkhush/picture')
user1.save()
当我做
时,我得到了结果 user = User.get(1) #user is a model instance
但是当我做的时候
user_obj = User.query.filter(name='Ankush').execute()
我得到[](空结果)
不知道为什么会这样?
答案 0 :(得分:1)
这有两个部分。首先,如果您想通过unique=True
定义的列获取项目,不需要使用索引,但查询不同。使用unique=True
和index=False
,您可以使用User.get_by()
表单获取该项目:
>>> User.get_by(name="Ankush")
<__main__.User object at 0x87070cc>
主要限制是您必须按照列中定义的完整列完全传递。这通常对于保留唯一的电子邮件地址(首先将它们小写!),用户名(小心您的大小写)以及其他示例非常有用。
第二部分是,当启用索引时,索引具有字符串/文本列的“不区分大小写的独特词袋”语义(我来自世界的搜索引擎方面,它有很大的不同(并且可以说比典型的数据库查询更好)语义。因此,如果要查找条目,则需要使用:
>>> class User(rom.Model):
... name = rom.String(required=True, unique=True, index=True)
... nickname = rom.String(required=False)
... photo = rom.String(required=False)
...
>>> user1 = User(name="Ankush", nickname="iamankush", photo="http://graph.facebook.com/iamkhush/picture")
>>> user1.save()
>>> User.query.filter(name="ankush").all()
[<__main__.User object at 0x870738c>]
(另请注意,.execute()
是.all()
)的别名。
如果您想使用index=True
定义的列更改区分大小写或其他行为,则需要传递自定义keygen参数(您可以在https://github.com/josiahcarlson/rom/blob/master/rom/util.py#L149 rom.util._string_keygen()
查看rom.String
{1}}和rom.Text
密钥生成语义)。
答案 1 :(得分:0)
您需要将index = True与name一起传递,以允许过滤器查询它。
class User(rom.Model):
name = rom.Text(required=True, unique=True,index = True,keygen=text_keyge)
nickname = rom.String(required=False)
photo = rom.String(required=False)