小编lim*_*to0的帖子

SQLAlchemy可以做什么,Django ORM不能做的例子

我最近在使用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.

python sqlalchemy django-orm

65
推荐指数
2
解决办法
1万
查看次数

Django Test Client post()返回302,尽管视图的帖子()有错误

我目前正在编写一些基本测试,以确保中型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兼容).

python testing django post http-status-code-404

14
推荐指数
1
解决办法
7755
查看次数

Django - 多态模型还是一个大模型?

我目前正在研究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.

总的来说,是否有任何普遍的偏好,或者我不应该使用多态的任何重大原因?

django polymorphism model django-models

12
推荐指数
1
解决办法
2988
查看次数

Char没有转换为int

出于某种原因,我的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.

我非常困惑.到底是怎么回事?

c argv

10
推荐指数
2
解决办法
3万
查看次数

SQLAlchemy的事务中的错误不会返回正确的回溯(Python 2.7)

在我当前的模型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)

sqlalchemy traceback python-2.7

7
推荐指数
1
解决办法
462
查看次数

在AWS控制台上更改Load Balancer的名称

导航到菜单> EC2>负载平衡>负载均衡器后,我发现我继承的一个重要的负载均衡器被命名为"testing",它应该被命名为对未来的dev ops更有意义的东西(即"搜索").此负载均衡器当前正在使用,并且正在运行一些实例.

我想在可能的情况下更改此负载均衡器的名称,或者至少找到一些方法在AWS控制台上明确说明此负载均衡器用于我们的"搜索"功能.我在LB上添加了一个标签,但没有办法在桌面上显示标签.

有没有办法更改负载均衡器的名称,或者至少在控制台的UI中添加"显示名称"或"注释"列?

load-balancing amazon-ec2 amazon-web-services

7
推荐指数
1
解决办法
5014
查看次数

将逗号分隔的字符串转换为列表但忽略引号中的逗号

我如何转换"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)

最终没有检测到任何东西,只是返回原来的清单.

我不明白为什么,它至少不应该检测到逗号?如果我?在逗号后添加一个,则会出现同样的问题.

python regex split delimiter

5
推荐指数
2
解决办法
2242
查看次数

Python:__init__ 中的继承和默认值

我正在尝试使用泛型__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 个参数,即使其余参数已给出默认值。有什么理由我不能这样做还是我在这里做错了什么?

python inheritance default init

4
推荐指数
1
解决办法
9372
查看次数

带选择窗口小部件的Django ModelForm - 使用object.uid作为默认选项值而不是object.id

我有一个继承自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方法,但我很确定这不是正确的方法.有谁知道我怎么做到这一点?

提前致谢.

django django-forms django-widget

4
推荐指数
1
解决办法
9892
查看次数

AWS ECR 获取登录密码 - Ubuntu 18.04 上的选择无效

尝试在 中运行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)

ubuntu aws-cli amazon-ecr

3
推荐指数
1
解决办法
1266
查看次数