问题描述
我有一个可以send/cancel/accept/delete
个朋友请求的应用程序,我正在尝试对其进行测试,但是当我接受一个朋友请求并将用户添加到其他朋友列表时,我得到了一个Failed lookup for key [user] in <User: test>
在测试中,我创建了一个好友请求对象,并向视图发送一个接受get
请求,该视图应将每个用户添加到其每个好友列表中,并删除friend_request
。 / p>
调试显示错误发生在视图中的以下行:user1.friends.add(user2)
上,因此实际上user2
已添加到user1
朋友列表中,但将user1
添加到了{{ 1}}朋友列表引发了上面提到的异常。
models.py
user2
views.py
class User(AbstractBaseUser,PermissionsMixin):
name = models.CharField('Full Name',max_length=35,unique=True,null=False,blank=False)
friends = models.ManyToManyField("User",blank=True)
def __str__(self):
return self.name
class FriendRequest(models.Model)
to_user = models.ForeignKey(User,related_name='to_user',on_delete=models.CASCADE)
from_user = models.ForeignKey(User,related_name='from_user',on_delete=models.CASCADE)
在这里,我正在使用from django.db import transaction
def accept_friend_request(request,pk):
try:
with transaction.atomic():
from_user = User.objects.get(pk=pk)
f_request = FriendRequest.objects.filter(
from_user=from_user,to_user=request.user
).first()
user1 = f_request.to_user
user2 = from_user
user1.friends.add(user2)
print(user1.friends.all())
user2.friends.add(user1)
print(user2.friends.all())
f_request.delete()
return redirect(request.get_full_path())
except Exception as ex:
print(ex)
return HttpResponse('User does not exist')
来防止异常破坏单元测试事务。
tests.py
transaction.atomic()
这是运行测试的结果:(您还可以看到第一个print语句的结果和正在打印的异常)
def setUp(self):
self.client = Client()
self.user = User.objects.create_user(email='test@gmail.com',name='test',password='test')
self.user1 = User.objects.create_user(email='test1@gmail.com',name='test1',password='test1')
self.client.force_login(self.user)
def test_accept_friend_request(self):
friend_request = FriendRequest.objects.create(from_user=self.user1,to_user=self.user)
self.client.get(reverse('accept_friend_request',kwargs={'pk': self.user1.pk}),follow=True)
self.assertIn(self.user,self.user1.friends.all())
self.assertIn(self.user1,self.user.friends.all())
更新
将Exception更改为IntegrityError会导致以下错误:
Ran 1 test in 1.266s
Failed (failures=1)
Destroying test database for alias 'default'...
System check identified no issues (0 silenced).
<QuerySet [<User: test1>]>
Failed lookup for key [user] in <User: test>
看起来elasticsearch-dsl与这里的异常有关。
更新
调试异常消息更改为
时raise VariableLookupError(django_elasticsearch_dsl.exceptions.VariableLookupError:
Failed lookup for key [user] in <User: test>
解决方法
所以我终于设法通过将重定向更改为request.META.get('HTTP_REFERER','/')
使其正常运行,看起来重定向循环出现了问题。