我的数据库中有一个合同表,合同主要基于列表和两个用户。在创建合同时,我想检查合同是否已经存在,如果是,则将用户重新更正为创建的合同。以下是我视图中的代码:
def create_proposal (request, conversation_pk):
existing_proposal = Contract.objects.filter(users__in=[user_1, user_2]).filter(listing_id=listing).values_list('id', flat=True)
然后我使用以下方式重定向:
if existing_proposal.exists():
messages.success(request, "the proposal already exists")
return HttpResponseRedirect(reverse('agreement:agreement', kwargs={'pk': existing_proposal[0].pk}))
但是,我收到以下错误:
AttributeError at /en/agreement/create_proposal/32
'int' object has no attribute 'pk'
答案 0 :(得分:0)
values_list
返回一个值列表,因此在评估表达式时没有查询集,实际上你有一个主键列表。当你想要说出一个模型的一个字段并迭代它来进行某种评估时,你就会使用它。在此查找现有提案的主要工作是filter
语句。
由于你假设有一个(并且只有一个匹配),最好这样做:
existing_proposal = Contract.objects.filter(users__in=[user_1, user_2]).filter(listing_id=listing).only('id').first()
这将返回符合您的过滤条件的第一个Contract
对象,并提取id
,这是重定向所需的全部内容。
然后在重定向中进行分配:
{'pk': existing_proposal.pk}
only
是可选的,但是,嘿,为什么不优化通话?