我有一个名为Thingwith called 的模型name,我希望name为char字段,只有 3个字符长.
我该怎么写测试?
class TestCase1(TestCase):
def test1(self):
thing = Thing(name='1234')
Run Code Online (Sandbox Code Playgroud)
那个测试应该失败.如何正确编写测试以便在该对象失败时测试通过?
我与django的用户和UserInfo有一对一的字段.我想订阅用户模型上的post_save回调函数,以便我可以保存UserInfo.
@receiver(post_save, sender=User)
def saveUserAndInfo(sender, instance, **kwargs):
user = instance
try:
user.user_info.save()
except:
info = UserInfo()
info.user = user
info.save()
Run Code Online (Sandbox Code Playgroud)
但是,TransactionManagementError当我尝试这样做时,我得到了一个.我假设因为用户模型还没有完成保存,我正在尝试读取id以将其保存到user_info.谁知道如何正确地做到这一点?
第二个问题.我想在创建用户后立即将UserInfo实例附加到用户.所以在post_init上我尝试创建一个UserInfo实例并将其分配给用户实例,但它不起作用,因为尚未为用户分配pk.我假设我只需要等到post_save(或更高版本)来创建此实例.这是唯一的方法吗?
追溯:
File "/Users/croberts/.virtualenvs/lunchbox/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
114. response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/Users/croberts/.virtualenvs/lunchbox/lib/python2.7/site-packages/django/contrib/admin/options.py" in wrapper
430. return self.admin_site.admin_view(view)(*args, **kwargs)
File "/Users/croberts/.virtualenvs/lunchbox/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapped_view
99. response = view_func(request, *args, **kwargs)
File "/Users/croberts/.virtualenvs/lunchbox/lib/python2.7/site-packages/django/views/decorators/cache.py" in _wrapped_view_func
52. response = view_func(request, *args, **kwargs)
File "/Users/croberts/.virtualenvs/lunchbox/lib/python2.7/site-packages/django/contrib/admin/sites.py" in inner
198. return view(request, *args, **kwargs)
File "/Users/croberts/.virtualenvs/lunchbox/lib/python2.7/site-packages/django/utils/decorators.py" in _wrapper
29. return bound_func(*args, **kwargs) …Run Code Online (Sandbox Code Playgroud) Django新手在这里.我正在尝试为我开发的简单API实现单元测试.下面你可以找到我的测试实现工作正常:
from django.test import TestCase
from my_app.models import MyModel
class TestMyViewSet(TestCase):
"""
Unit tests for endpoints in MyViewSet.
"""
fixtures = ['my_app/fixtures/data.yaml']
def setUp(self):
# Making setup for the test case here.
def test_post_my_resource(self):
# Checking that fixture is loaded correctly.
self.assertEqual(MyModel.objects.all().count(),1)
request_body = {
'my_resource': "input_for_my_resource"
}
response = self.client.post('/my_resources/', data=request_body)
self.assertEqual(response.status_code, 201)
# self.assertEqual(MyModel.objects.all().count(),2)
Run Code Online (Sandbox Code Playgroud)
但是,当我通过检查实例数量self.assertEqual(MyModel.objects.all().count(),2)从注释中删除最后一行以测试my_resource在相应模型上成功创建时,我收到一条错误,说明以下内容:
TransactionManagementError:当前事务中发生错误.在"原子"块结束之前,您无法执行查询.
我在这里错过了什么?
提前致谢!
PS:我遇到了以下问题:TransactionManagementError"在使用信号时你不能在'原子'块结束之前执行查询",但仅在单元测试期间但我不确定在我的情况下发生的情况是相同的.
阅读了多种解决方案来源,例如Guaravs帖子(包括评论中的所有建议)和Alexander等,但仍然无法解决问题。创建数据库条目@models.OrderItemTax.objects.create() 时出现错误
使用 django 1.11.3 和 MySQL 14.14
views.py **只有部分代码,因为该函数超过 600 行。
def checkout_cart(request):
try:
item_to_group_keys = []
promo_key = 'promo:' + str(request.user.id)
with connection.cursor() as cursor:
with transaction.atomic():
// more code here...
try:
with transaction.atomic(): // updated solution
event = ''
group = models.Group.objects.get(id=order_item.group.id)
now = timezone.now()
event_date = now.strftime('%Y-%m-%d')
try:
event = models.Event.objects.get(group_id=group.id, date=event_date)
try:
self_attendee = models.EventAttendee.objects.get(event=event,
user_id=request.user.id,
is_attending=True)
except:
self_attendee = models.EventAttendee.objects.create(event=event,
user_id=request.user.id,
is_attending=True)
self_attendee.save()
except models.Event.DoesNotExist:
event = models.Event.objects.create(group_id=group.id, date=event_date, planner_id=request.user.id) …Run Code Online (Sandbox Code Playgroud)