我有一个Django模型:
class QuestionAnswer(models.Model):
question = models.ForeignKey(Question)
marks = models.FloatField(null=True)
graded = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
现在在命令行中我做:
>>> qa = QuestionAnswer.objects.filter(pk=12345)
>>> qa[0].graded
0
>>> qa[0].graded = 1
>>> qa[0].save()
>>> qa = QuestionAnswer.objects.filter(pk=12345)
>>> qa.graded
0
Run Code Online (Sandbox Code Playgroud)
该graded字段未更新.
但当我这样做时:
>>> qa = QuestionAnswer.objects.get(pk=12345)
>>> qa.graded
0
>>> qa.graded = 1
>>> qa.save()
>>> qa = QuestionAnswer.objects.get(pk=12345)
>>> qa.graded
1
Run Code Online (Sandbox Code Playgroud)
为什么不objects.filter更新字段但objects.get有效?
试图访问产品的价格,使用文档.但是获得属性错误.
>>> from oscar.apps.partner import strategy, prices
>>> from oscar.apps.catalogue.models import *
>>> product = Product.objects.get(pk=1)
>>> info = strategy.fetch_for_product(product)
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'fetch_for_product'
Run Code Online (Sandbox Code Playgroud)
要查看策略的所有属性,我会这样做
>>> dir(strategy)
>>> ['Base', 'D', 'Default', 'DeferredTax', 'FixedRateTax', 'NoTax', 'PurchaseInfo',
'Selector', 'StockRequired', 'Structured', 'UK', 'US', 'UseFirstStockRecord',
'__builtins__', '__doc__', '__file__', '__name__',
'__package__', 'availability', 'namedtuple', 'prices']
Run Code Online (Sandbox Code Playgroud)
所以fetch_for_product不属于策略属性.现在我如何获取特定产品的价格?
我正在使用基于类的通用视图Listview来列出所有对象.
我的views.py:
class PostsList(ListView):
model = Post
template_name = "index.html"
Run Code Online (Sandbox Code Playgroud)
我的Urls.py:
urlpatterns = [
url(r'^$',PostsList.as_view(), name = "home"),
]
Run Code Online (Sandbox Code Playgroud)
这给了我所有帖子的清单.现在我想基于Model的某些字段来过滤/排序帖子Post,比方说price.我需要自己写这个吗?如果是,PostsLists我覆盖哪种类的方法?def get,def get_context?
我看到Listview的get方法定义如下.在其中我可以**kwargs直接传递URL查询参数,或者我必须在我的类中覆盖以下方法.
def get(self, request, *args, **kwargs):
....
Run Code Online (Sandbox Code Playgroud) 我正在使用命令行中的参数运行单元测试。下面是我的测试代码。
import unittest
import sys
from toolbox.models import *
akit_id = sys.argv[1]
class TestQuizCase(unittest.TestCase):
def testupdate_quiz(self):
akit = AssignmentKit.objects.get(pk = akit_id)
akit.update_score_grade()
self.assertEqual(akit.marks, 50000)
if __name__ == "__main___":
del sys.argv[1:]
unittest.main()
Run Code Online (Sandbox Code Playgroud)
现在从命令行我正在做:
>>> python test_quiz.py 2000
Run Code Online (Sandbox Code Playgroud)
什么都没有,因此没有进行测试。我尝试了日志记录,发现控件甚至没有进入测试功能。我缺少的是导致问题的 sys.argv 吗?
我在 settings.py 中定义了一个 mysql 数据库
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME':'<name>',
'USER':'<user>',
'PASSWORD':'<password>'
}
}
Run Code Online (Sandbox Code Playgroud)
现在我需要为我的单元测试创建一个测试数据库。哪里需要提到测试数据库的设置,或者我根本不必提到它们?
当我这样做时进行测试:
python manage.py test my_app
Run Code Online (Sandbox Code Playgroud)
它说:
Creating test database for alias 'default'...
Skipping creation of NoticeTypes as notification app not found
E
======================================================================
ERROR: test_update_quiz (toolbox.tests.TestQuizCase)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/opt/2.0/site/toolbox/tests.py", line 20, in test_update_quiz
akit = AssignmentKit.objects.get(pk = akit_id)
File "/usr/local/lib/python2.7/site-packages/django/db/models/manager.py", line 131, in get
return self.get_query_set().get(*args, **kwargs)
File "/usr/local/lib/python2.7/site-packages/django/db/models/query.py", line 366, in get
% self.model._meta.object_name)
DoesNotExist: AssignmentKit …Run Code Online (Sandbox Code Playgroud)