我最近在使用Pyramid和SQLAlchemy进行了大量的研究,而不是在Django中保留当前的应用程序.这本身就是一场辩论,但我不是在讨论这个问题.
我想知道的是,为什么SQLAlchemy普遍被认为比Django ORM更好?几乎每一个(如果不是每一个)我在SQLAlchemy这两个好处之间找到的比较.我认为性能是一个很大的性能,因为SQLAlchemy的结构可以让它更顺利地转换为SQL.
但是,我也听说过,使用更难的任务,Django ORM几乎不可能使用.我想说明这可能是一个多大的问题.我一直在阅读切换到SQLAlchemy的原因之一是当Django ORM不再适合您的需求时.
因此,简而言之,有人可以提供SQLAlchemy可以执行的查询(不一定是实际的SQL语法),但Django ORM不可能在没有添加额外的原始SQL的情况下做到吗?
更新:
自从我第一次问到这个问题以来,我一直注意到这个问题得到了很多关注,所以我想多花两美分.
最后我们最终使用了SQLAlchemy,我必须说我对这个决定感到满意.
我正在重新审视这个问题以提供SQLAlchemy的一个额外功能,到目前为止,我还没有能够在Django ORM中复制.如果有人可以提供一个如何做到这一点的例子,我会很乐意吃掉我的话.
假设您想使用一些postgresql函数,例如similarity(),它提供模糊比较(请参阅:快速查找与PostgreSQL类似的字符串 - tl; dr输入两个字符串获得百分比相似性).
我已经用Django ORM做了一些关于如何做到这一点的搜索,除了使用原始的sql之外什么也没发现,因为他们的文档中似乎很明显:https://docs.djangoproject.com/en/dev/topics/db/sql /.
即
Model.objects.raw('SELECT * FROM app_model ORDER BY \
similarity(name, %s) DESC;', [input_name])
Run Code Online (Sandbox Code Playgroud)
但是,SQLalchemy有func(),如下所述:http://docs.sqlalchemy.org/en/latest/core/sqlelement.html#sqlalchemy.sql.expression.func
from sqlalchemy import desc, func
session.query(Model).order_by(func.similarity(Model.name, input_name))
Run Code Online (Sandbox Code Playgroud)
这允许您为任何已定义的sql/postgresql/etc函数生成sql,而不需要原始sql.
我目前正在编写一些基本测试,以确保中型Django应用程序中的页面正确地进行GET和POST.但是,使用django.test.client.Client时应该不会可靠地失败.即使我的代码中存在明显错误,它也会返回302响应.
在我的app/urls.py中:
url(r'^mymodel/create/$',
views.MyModelView.as_view(),
name = 'my_model_create'),
Run Code Online (Sandbox Code Playgroud)
然后,为了有意创建500响应,我做了以下事情:
class MyModelCreateView(MyModelView, CreateView):
def post(self, request, *args, **kwargs):
print self.hello
self.object = MyModel()
return super(MyModelCreateView, self).post(request, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
显然,视图没有任何名为hello的对象.尝试通过浏览器发送请求时,这会按预期失败.
甚至还用"打印self.hello"取代了
return HttpResponse(status = 500)
Run Code Online (Sandbox Code Playgroud)
然而,我仍然得到以下内容:
#We have a model called Client, so it
#is imported as RequestClient to avoid conflicts
In [1]: from django.test.client import Client as RequestClient
In [2]: client = RequestClient()
In [3]: response = client.post("/app/mymodel/create/")
In [4]: response.status_code
Out[4]: 302
Run Code Online (Sandbox Code Playgroud)
显然,这里的问题出在键盘和主席之间,因为如果正确完成,Client()/ RequestClient()没有理由不返回500错误.甚至出现一些问题,因为我收到302个POST请求的响应而不是200个响应,但这可能是因为我们正在使用HttpRedirect.
有没有人知道这里可能存在什么问题?作为参考,我使用的是Python 2.7和Django 1.5(尽管我可能需要与Django 1.4兼容).
我目前正在研究Django中的一个模型,该模型涉及一个模型,它可以具有各种不同的特征,具体取决于它是什么类型的对象.所以,假设我们有一个名为Mammal的模型,它可以是大象或海豚(分别具有自己的特征"tusk_length"和"flipper_length").
基本的OOP原则呼喊"多态",我倾向于同意.但是,由于我是Django的新手,我首先要知道它是否是在Django中这样做的最佳方式.我听说过很多例子和一些人对奇异巨型模特的偏好
我已经尝试过使用GenericForeignKeys,如下所述:我如何将Django的GenericForeignKey限制为模型列表?.虽然这个解决方案运行得很漂亮,但我不喜欢无法过滤,而且这种关系只是一种方式.也就是说,虽然你可以从哺乳动物物体中获得海豚,但你无法从海豚身上获得哺乳动物物体.
所以,这是我的两个选择:
选择A:
from django.db import models
class Mammal(models.Model):
hair_length = models.IntegerField()
tusk_length = models.IntegerField()
flipper_length = models.IntegerField()
animal_type = models.CharField(max_length = 15, choices = ["Elephant", "Dolphin"]
Run Code Online (Sandbox Code Playgroud)
选择B:
from django.db import models
class Mammal(models.Model):
hair_length = models.IntegerField()
class Elephant(Mammal):
tusk_length = models.IntegerField()
class Dolphin(Mammal):
flipper_length = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
根据我的理解,选择B在查询和列出所有大象或海豚时具有更好的代码优势.但是,我注意到从哺乳动物列表中获取所有大象并不是那么简单(有没有查询?)而没有在类中放入animal_type,默认依赖于类.
这导致了我看到的多态性的另一个问题,在上面的例子或我的应用程序中都没有出现,但值得一提的是,如果不完全删除Dolphin,很难将Dolphin对象编辑成Elephant.
总的来说,是否有任何普遍的偏好,或者我不应该使用多态的任何重大原因?
出于某种原因,我的C程序拒绝将argv的元素转换为int,我无法弄清楚原因.
int main(int argc, char *argv[])
{
fprintf(stdout, "%s\n", argv[1]);
//Make conversions to int
int bufferquesize = (int)argv[1] - '0';
fprintf(stdout, "%d\n", bufferquesize);
}
Run Code Online (Sandbox Code Playgroud)
这是运行./test 50时的输出:
50
-1076276207
我试过删除(int),抛出一个*和一个&之间(int)和argv [1] - 前者给了我一个5而不是50,但后者给了我一个类似于上面的输出.删除 - '0'操作没有多大帮助.我也尝试先制作一个char = argv [1]然后首先使用转换来进行转换,这很奇怪,不管输入如何都给了我一个17.
我非常困惑.到底是怎么回事?
在我当前的模型User中,我有一个字段"name",它不能为null.
我尝试创建一个用户对象,并将其添加到Pyramid提供的DBSession并使用事务提交,就像这样.
with transaction.manager:
u = models.User()
models.DBSession.add(u)
Run Code Online (Sandbox Code Playgroud)
对于那些不使用金字塔的人,DBSession是:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Run Code Online (Sandbox Code Playgroud)
现在,在上面的交易中,我确实有一个验证问题 - 我需要为User分配一个名称,但我没有.但是,我没有收到错误告诉我"你需要为用户分配一个名字!",我得到了这个:
<ipython-input-5-47d9c0e393f7> in <module>()
2 u = models.User()
----> 3 models.DBSession.add(u)
4
/home/user/Projects/env/local/lib/python2.7/site-packages/transaction-1.4.1-py2.7.egg/transaction/_manager.pyc in __exit__(self, t, v, tb)
118 def __exit__(self, t, v, tb):
119 if v is None:
--> 120 self.commit()
121 else:
122 self.abort()
/home/user/Projects/env/local/lib/python2.7/site-packages/transaction-1.4.1-py2.7.egg/transaction/_manager.pyc in commit(self)
109 """ See ITransactionManager.
110 """
--> 111 return self.get().commit()
112
113 def abort(self):
/home/user/Projects/env/local/lib/python2.7/site-packages/transaction-1.4.1-py2.7.egg/transaction/_transaction.py in commit(self)
276 tb = None
277 try:
--> 278 t, v, …
Run Code Online (Sandbox Code Playgroud) 导航到菜单> EC2>负载平衡>负载均衡器后,我发现我继承的一个重要的负载均衡器被命名为"testing",它应该被命名为对未来的dev ops更有意义的东西(即"搜索").此负载均衡器当前正在使用,并且正在运行一些实例.
我想在可能的情况下更改此负载均衡器的名称,或者至少找到一些方法在AWS控制台上明确说明此负载均衡器用于我们的"搜索"功能.我在LB上添加了一个标签,但没有办法在桌面上显示标签.
有没有办法更改负载均衡器的名称,或者至少在控制台的UI中添加"显示名称"或"注释"列?
我如何转换"1,,2'3,4'"
成列表?逗号分隔各个项目,除非它们在引号内.在这种情况下,逗号将包含在项目中.
这是理想的结果:['1', '', '2', '3,4']
.我在另一个线程上发现忽略引号的一个正则表达式如下:
re.compile(r'''((?:[^,"']|"[^"]*"|'[^']*')+)''')
Run Code Online (Sandbox Code Playgroud)
但这给了我这个输出:
['', '1', ',,', "2'3,4'", '']
Run Code Online (Sandbox Code Playgroud)
我无法理解,这些额外的空字符串来自哪里,为什么两个逗号甚至都被打印出来,更不用说在一起了.
我自己尝试制作这个正则表达式:
re.compile(r'''(, | "[^"]*" | '[^']*')''')
Run Code Online (Sandbox Code Playgroud)
最终没有检测到任何东西,只是返回原来的清单.
我不明白为什么,它至少不应该检测到逗号?如果我?
在逗号后添加一个,则会出现同样的问题.
我正在尝试使用泛型__init__
值创建一个类,但其子类具有默认值,如下所示:
class Enemy:
def __init__(self, difficulty, power, MaxHP, magic, MaxMP, speed, name):
self.power = power + 2*difficulty
self.HP = self.MaxHP = MaxHP + 5*difficulty
self.magic = magic + 2* difficulty
self.MP = self.MaxMP = MaxMP + 5*difficulty
class Goblin(Enemy):
def __init_(self, difficulty = 1, power = 1, MaxHP = 5, magic = 1, MaxMP = 5, speed = 5, name = "Goblin"):
super(Goblin, self).__init__(self, power, MaxHP, magic, MaxMP, speed, name)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试创建一个没有全部默认值的 Goblin 对象时(例如,我将只输入一个难度值),它告诉我我需要完整的 8 个参数,即使其余参数已给出默认值。有什么理由我不能这样做还是我在这里做错了什么?
我有一个继承自ModelForm的表单:
class ChildModel(ModelForm):
class Meta:
model = Documents
fields = ('secretdocs')
widgets = {
'secretdocs': Select(attrs={'class': 'select'}),
}
Run Code Online (Sandbox Code Playgroud)
模型"secretdocs"有一个uid.但是当它打印出select和option时,选项值显示如下:
<select class="select" id="id_secretdocs" name="secretdocs">
<option value="1">My Secret Doc</option>
</select>
Run Code Online (Sandbox Code Playgroud)
但是我希望它具有选项的uid:
<select class="select" id="id_secretdocs" name="secretdocs">
<option value="cd2feb4a-58cc-49e7-b46e-e2702c8558fd">My Secret Doc</option>
</select>
Run Code Online (Sandbox Code Playgroud)
到目前为止,我试图使用BaseForm的数据对象并覆盖Select的value_from_datadict方法,但我很确定这不是正确的方法.有谁知道我怎么做到这一点?
提前致谢.
尝试在 中运行get-login-password
命令时aws ecr
,我收到一条消息,指出这是一个无效选择:
$ aws --region=us-west-1 ecr get-login-password
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:
aws help
aws <command> help
aws <command> <subcommand> help
aws: error: argument operation: Invalid choice, valid choices are:
batch-check-layer-availability | batch-delete-image
batch-get-image | complete-layer-upload
create-repository | delete-lifecycle-policy
delete-repository | delete-repository-policy
describe-images | describe-repositories
get-authorization-token | get-download-url-for-layer
get-lifecycle-policy | get-lifecycle-policy-preview
get-repository-policy | initiate-layer-upload
list-images | put-image
put-lifecycle-policy | set-repository-policy
start-lifecycle-policy-preview | upload-layer-part
get-login | …
Run Code Online (Sandbox Code Playgroud) python ×4
django ×3
sqlalchemy ×2
amazon-ec2 ×1
amazon-ecr ×1
argv ×1
aws-cli ×1
c ×1
default ×1
delimiter ×1
django-forms ×1
django-orm ×1
inheritance ×1
init ×1
model ×1
polymorphism ×1
post ×1
python-2.7 ×1
regex ×1
split ×1
testing ×1
traceback ×1
ubuntu ×1