我只是好奇是否有人知道django的orm是否有充分理由不在模型上调用'full_clean',除非它被保存为模型表单的一部分.
请注意,调用模型的save()方法时,不会自动调用full_clean().如果要为自己手动创建的模型运行一步模型验证,则需要手动调用它. django完全干净的文档
(注意:为Django 1.6更新了引用...以前的django文档也有关于ModelForms的警告.)
有没有充分的理由让人们不想要这种行为?我想如果你花时间为模型添加验证,那么每次保存模型时都需要运行验证.
我知道如何使一切正常工作,我只是在寻找解释.
我正在尝试使用django和mongoengine来提供只有GridFS的存储后端.我还有一个MySQL数据库.
当我从django管理员中删除时,我遇到了一个奇怪的(对我而言)错误,我想知道我是否做错了什么.
我的代码看起来像这样:
# settings.py
from mongoengine import connect
connect("mongo_storage")
# models.py
from mongoengine.django.storage import GridFSStorage
class MyFile(models.Model):
name = models.CharField(max_length=50)
content = models.FileField(upload_to="appsfiles", storage=GridFSStorage())
creation_time = models.DateTimeField(auto_now_add=True)
last_update_time = models.DateTimeField(auto_now=True)
Run Code Online (Sandbox Code Playgroud)
我能够很好地上传文件,但是当我删除它们时,似乎有些东西会破坏,mongo数据库似乎处于不可行状态,直到我手动删除所有FileDocument.objects.发生这种情况时,我无法上传文件或从django界面删除它们.
从堆栈跟踪我有:
/home/projects/vector/src/mongoengine/django/storage.py in _get_doc_with_name
doc = [d for d in docs if getattr(d, self.field).name == name] ...
? Local vars
Variable Value
_[1]
[]
d
docs
Error in formatting: cannot set options after executing query
name
u'testfile.pdf'
self
/home/projects/vector/src/mongoengine/fields.py in __getattr__
raise AttributeError
Run Code Online (Sandbox Code Playgroud)
我是否错误地使用此功能?
感谢@ zeekay的回答,我能够得到一个工作的gridfs存储插件.我最终根本没有使用mongoengine.我把我的改编解决方案放在github上 …
我是一个新的移动应用程序开发的新手,并在我应该如何在我的应用程序中传递用户数据.
我已经尝试了几件事,但似乎都没有,我确信我应该遵循最好的练习模式.
因为它使示例更容易,我使用firebase进行身份验证.我目前有一个单独的登录路径.一旦我登录,我想在大多数视图中使用用户模型来检查显示内容的权限,在抽屉中显示用户信息等...
Firebase有一个await firebaseAuth.currentUser();最佳做法是在您可能需要用户的任何地方调用它吗?如果是这样,这个电话的最佳位置在哪里?
该扑代码实验室展示一个很好的例子,允许写入之前认证用户.但是,如果页面需要检查auth以确定要构建的内容,则异步调用不能进入该build方法.
我尝试过的一种方法是覆盖initState并启动调用以获取用户.当未来完成时,我呼叫setState并更新用户.
FirebaseUser user;
@override
void initState() {
super.initState();
_getUserDetail();
}
Future<Null> _getUserDetail() async {
User currentUser = await firebaseAuth.currentUser();
setState(() => user = currentUser);
}
Run Code Online (Sandbox Code Playgroud)
这很有效,但似乎需要它的每个小部件的很多仪式.屏幕在没有用户的情况下加载时也会闪烁,然后在未来完成时与用户进行更新.
这也有效,但是有很多样板可以让用户通过可能需要访问它们的所有路由,视图和状态.此外,我们不能只popAndPushNamed在转换路由时这样做,因为我们无法将变量传递给它.我们必须更改类似于此的路线:
Navigator.push(context, new MaterialPageRoute(
builder: (BuildContext context) => new MyPage(user),
));
Run Code Online (Sandbox Code Playgroud)
https://medium.com/@mehmetf_71205/inheriting-widgets-b7ac56dbbeb1
这篇文章展示了一个很好的使用模式InheritedWidget.当我将继承的小部件放在MaterialApp级别时,当auth状态改变时,子节点不会更新(我确定我做错了)
FirebaseUser user;
Future<Null> didChangeDependency() async {
super.didChangeDependencies();
User currentUser = await firebaseAuth.currentUser();
setState(() => user = currentUser);
}
@override
Widget …Run Code Online (Sandbox Code Playgroud) 我正在使用Michael Foord编写的模拟库来帮助我测试django应用程序.
我想测试我正在设置我的查询,但我认为我不需要实际访问数据库,所以我试图模拟查询.
我可以很好地模拟查询的第一部分,但是当我链接其他内容时,我没有得到我想要的结果.
功能:
@staticmethod
def get_policies(policy_holder, current_user):
if current_user.agency:
return Policy.objects.filter(policy_holder=policy_holder, version__agency=current_user.agency).distinct()
else:
return Policy.objects.filter(policy_holder=policy_holder)
和我的测试:第一个断言通过,第二个断言失败.
def should_get_policies_for_agent__user(self):
with mock.patch.object(policy_models.Policy, "objects") as query_mock:
user_mock = mock.Mock()
user_mock.agency = "1234"
policy_models.Policy.get_policies("policy_holder", user_mock)
self.assertEqual(query_mock.method_calls, [("filter", (), {
'policy_holder': "policy_holder",
'version__agency': user_mock.agency,
})])
self.assertTrue(query_mock.distinct.called)
我很确定问题是初始query_mock在调用.filter()之后返回一个新的模拟,但我不知道如何捕获新的模拟并确保调用.distinct().
有没有更好的方法来测试我想要的东西?我正在努力确保调用正确的查询.
我正在尝试使用webapp2对处理程序进行单元测试,并且遇到了一个只是一个愚蠢的小错误.
我希望能够在测试中使用webapp2.uri_for,但我似乎无法做到这一点:
def test_returns_200_on_home_page(self):
response = main.app.get_response(webapp2.uri_for('index'))
self.assertEqual(200, response.status_int)
Run Code Online (Sandbox Code Playgroud)
如果我这样做main.app.get_response('/')就行了.
收到的例外是:
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/unittest/case.py", line 318, in run
testMethod()
File "tests.py", line 27, in test_returns_200_on_home_page
webapp2.uri_for('index')
File "/Users/.../webapp2_example/lib/webapp2.py", line 1671, in uri_for
return request.app.router.build(request, _name, args, kwargs)
File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 173, in __getattr__
return getattr(self._get_current_object(), name)
File "/Users/.../webapp2_example/lib/webapp2_extras/local.py", line 136, in _get_current_object
raise RuntimeError('no object bound to %s' % self.__name__)
RuntimeError: no object bound to request
Run Code Online (Sandbox Code Playgroud)
我有什么愚蠢的设置吗?
App Engine SDK 1.9.24于2015年7月20日发布,因此如果您仍然遇到此问题,您应该可以通过更新来解决此问题.有关确切问题和解决方案的解释,请参阅下面的+ jpatokal的答案.
我有一个我正在使用的应用程序,并在本地开发时遇到麻烦.
我们有一些共享代码,用于检查我们的应用程序使用的auth服务器urllib2.urlopen.当我在本地开发时,我的应用程序上的404被AppEngine请求拒绝,但是请求从终端获得成功.
我在端口上运行appengine localhost:8000,并且启动了auth服务器localhost:8001
import urllib2
url = "http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE="
try:
r = urllib2.urlopen(url)
print(r.geturl())
print(r.read())
except urllib2.HTTPError as e:
print("got error: {} - {}".format(e.code, e.reason))
Run Code Online (Sandbox Code Playgroud)
这是got error: 404 - Not Found从AppEngine中产生的
似乎AppEngine正在将架构,主机和端口添加到我想要命中的URL的PATH部分,因为这是我在auth服务器上看到的:
[02/Jul/2015 16:54:16] "GET http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE= HTTP/1.1" 404 10146
Run Code Online (Sandbox Code Playgroud)
从请求标题我们可以看到整个方案和主机和端口作为路径的一部分传递(下面的标题部分):
'HTTP_HOST': 'localhost:8001',
'PATH_INFO': u'http://localhost:8001/api/CheckAuthentication/',
'SERVER_PORT': '8001',
'SERVER_PROTOCOL': 'HTTP/1.1',
Run Code Online (Sandbox Code Playgroud)
有没有办法让AppEngine Dev服务器在另一个端口上将这个请求劫持到localhost?或者我不是在误解发生了什么?在我们的域名不同的生产中,一切都很好.
提前感谢任何协助,帮助我指出正确的方向.
我正在测试我的应用程序,我遇到了一个问题,我不知道为什么.我正在为我的测试加载灯具,灯具有相互依赖的外键.它们必须按特定顺序加载,否则将无法运行.
我正在加载的灯具是:
["test_company_data", "test_rate_index", 'test_rate_description']
公司数据是第一个.test_rate_index具有公司的外键,test_rate_description具有test_rate_index中声明的模型的外键.(顺便说一句,不同的测试需要不同的装置,这就是为什么我不只是将所有东西都推到一起)
如果我使用django的标准过程来加载测试,则测试不会以正确的顺序加载.
class TestPackages(test.TestCase):
fixtures = ["test_company_data", "test_rate_index", "test_rate_description",]
我收到了消息
DoesNotExist: RateDescription matching query does not exist.
但是,如果我颠倒我的灯具的顺序(这没有任何意义)它的工作原理:
fixtures = ["test_rate_description", "test_company_data", "test_rate_index",]
Django的文档声明夹具按照声明的顺序加载,但似乎并非如此.
作为一种解决方法,而不是使用django的
call_command('loaddata', *fixtures, **{
'verbosity': 0,
'commit': False,
'database': 'default'
})
我在setUp方法中使用了一个不同的函数,一次加载一个fixture.
def load_fixtures(fixtures):
for fixture in fixtures:
call_command('loaddata', fixture, **{
'verbosity': 0,
'commit': False,
'database': 'default'
})
在尝试使用标准方法时,是否有一些我正在做错误或不理解导致我的灯具没有以正确的顺序加载?
Django使用Meta类来获取大量额外的对象信息.但是,它们将此信息存储在对象'_meta'中,该对象通过命名约定是私有的.
整个django管理员(和其他地方)我看到的东西opts = model._meta,然后他们使用像app_label和的各种选项verbose_name.
我是否可以自信地访问._meta并确保它将来不会改变,或者我最好创建一个"访问者"mixin或者在一个地方访问._meta的东西,所以如果它确实改变我只有更新一件事?