编辑:
请参阅本问题底部的完整答案.
tl;博士回答:Python有静态嵌套的范围.的静态 方面可以与隐变量声明相互作用,产生非显而易见的结果.
(这可能特别令人惊讶,因为语言通常具有动态性质).
我认为我对Python的范围规则有一个很好的处理,但是这个问题让我彻底陷入困境,而且我的google-fu让我失望了(不是我很惊讶 - 看看问题标题;)
我将从一些可以按预期工作的示例开始,但是可以自由地跳到示例4的多汁部分.
例1.
>>> x = 3
>>> class MyClass(object):
... x = x
...
>>> MyClass.x
3
Run Code Online (Sandbox Code Playgroud)
足够简单:在类定义期间,我们能够访问外部(在本例中为全局)范围中定义的变量.
例2.
>>> def mymethod(self):
... return self.x
...
>>> x = 3
>>> class MyClass(object):
... x = x
... mymethod = mymethod
...
>>> MyClass().mymethod()
3
Run Code Online (Sandbox Code Playgroud)
再次(忽略了为什么人们可能想要这样做),这里没有任何意外:我们可以访问外部范围中的函数.
注意:正如Frédéric在下面指出的那样,这个功能似乎不起作用.请参见示例5(及更高版本).
例3.
>>> def myfunc():
... x = 3
... class MyClass(object):
... x = x
... return MyClass
... …Run Code Online (Sandbox Code Playgroud) 是否存在关于接口状态(与持久模型状态相对)应该存在于Ember.js应用程序中的官方故事?
在路由器文档的"响应用户启动的事件"部分中,有一个将点击事件委托给照片的"showPhoto"方法的示例,但是模型"显示"本身似乎是一种不合需要的混合关注点.
我知道在许多情况下,状态应该存储在路由器中,以便接口状态在URL中表示,并在刷新页面或将URL发送给某人时恢复.但是非分层状态呢,例如页面上选择的项目列表呢?
理想情况下,该类型的状态将被序列化为查询/哈希参数(例如:http://www.hipmunk.com/flights/QSF-to-NYC#!dates=Sep15,Sep16p1;kind=flight&locations=QSF,YYZ&dates=Sep15 ,Sep23~tab = 1)但据我所知,路由器不提供该功能,是吗?
在BackboneConf,Jeremy Ashkenas说在Backbone中做到这一点的正确方法是将状态存储在模型上(他有一个带有"选定"字段的模型的例子).但是我相信汤姆戴尔说他认为这不是一个好主意,而不是在Ember应该怎么做.不幸的是,我不记得他提到应该怎么做.
tl; dr:在模型保存正式不支持的情况下编辑模型的属性?我似乎记得,在大约2013年,国家机器拒绝了在记录处于飞行状态时进行编辑的尝试,但我认为该限制已被删除.它不再抛出状态机错误......它似乎只会导致错误:/
在我正在处理的应用程序中,按Enter键创建一个新条目并聚焦标题字段,让用户立即开始输入.对该字段的更改将通过去抖动保存自动保留.通常这很好用,但如果我开始输入太快,我会收到以下错误:
Attempted to handle event `didCommit` on <app@model: ...> while in state root.loaded.updated.uncommitted.
Run Code Online (Sandbox Code Playgroud)
(我在底部包含了完整的错误和追溯[1])
该记录看起来似乎已经正确地保存到服务器(Firebase通过EmberFire适配器),但是从那时起该应用程序还有其他奇怪之处(可能是因为运行循环的迭代在完成之前爆炸).
为了了解情况,我将观察者附加到模型currentState.stateName和title字段上.对于无错误的创建和保存,记录将通过以下状态:
[Press Enter; Pause]
|
V
root.loaded.created.uncommitted
|
V
<title observer fires with blank>
|
V
root.loaded.created.inFlight
|
V
root.loaded.saved
|
V
[Type in title]
|
V
root.loaded.updated.uncommitted
|
V
<title observer fires with value>
|
V
root.loaded.updated.inFlight
|
V
root.loaded.saved
Run Code Online (Sandbox Code Playgroud)
出现错误时,过程如下所示:
[Press Enter & type immediately]
|
V
root.loaded.created.uncommitted
|
V …Run Code Online (Sandbox Code Playgroud) 必须有办法通过ORM进行此查询,但我没有看到它.
这就是我的建模:一个租户可以占用多个房间,一个用户可以拥有多个房间.所以房间有一个FK到租户和一个FK到用户.客房也由(可能不同的)用户维护.
也就是说,我有这些(简化)模型:
class Tenant(models.Model):
name = models.CharField(max_length=100)
class Room(models.Model):
owner = models.ForeignKey(User)
maintainer = models.ForeignKey(User)
tenant = models.ForeignKey(Tenant)
Run Code Online (Sandbox Code Playgroud)
给定租户,我希望用户拥有他们占据的房间.
相关的SQL查询将是:
SELECT auth_user.id, ...
FROM tenants_tenant, tenants_room, auth_user
WHERE tenants_tenant.id = tenants_room.tenant_id
AND tenants_room.owner_id = auth_user.id;
Run Code Online (Sandbox Code Playgroud)
例如,可以使用相关用户对象获取任何单个值my_tenant.rooms.values_list('owner__email', flat=True),但获取用户的完整查询集会让我感到沮丧.
通常一个方式来解决这将是建立一个ManyToMany场在我Tenant的模型指向User同TenantRoom为"到"模型.这将不会在这种情况下工作,虽然,因为TenantRoom模型具有第二(无关)ForeignKey到User(见"restictions").此外,它似乎是租户模型上的不必要的混乱.
做得my_tenant.rooms.values_list('user', flat=True)让我接近,但返回用户ID的ValuesListQuerySet而不是实际User对象的查询集.
那么:有没有办法通过ORM只使用一个查询来获取实际模型实例的查询集?
编辑
事实上,如果通过ORM在一个查询中没有办法直接执行此操作,那么最好的(大多数高性能,最惯用,最可读等的组合)方法能够实现我正在寻找的东西吗?以下是我看到的选项:
子选择
users = User.objects.filter(id__in=my_tenant.rooms.values_list('user'))
Run Code Online (Sandbox Code Playgroud)通过Python进行子选择(有关此背后的推理,请参阅性能注意事项)
user_ids = id__in=my_tenant.rooms.values_list('user')
users = User.objects.filter(id__in=list(user_ids)) …Run Code Online (Sandbox Code Playgroud)我正在尝试测试对shift+ deletekey组合作出反应的事件处理程序,但该Test.keyEvent方法的Ember文档似乎没有提及激活修饰键的任何方法.
我试图发出一个keydown上shift(键代码16),然后keydown在delete(键代码46):
keyEvent('.my input', 'keydown', 16); // Shift
keyEvent('.my input', 'keydown', 46); // Delete
keyEvent('.my input', 'keyup', 46); // Delete
keyEvent('.my input', 'keyup', 16); // Shift
Run Code Online (Sandbox Code Playgroud)
但删除事件的shiftKey属性仍未定义
ember.js ×3
python ×2
django ×1
django-orm ×1
ember-data ×1
emberfire ×1
javascript ×1
namespaces ×1
scope ×1
testing ×1