从Django中的查询集中检索对象ID

时间:2018-06-02 14:42:47

标签: django django-queryset primary-key

我的数据库中有一个合同表,合同主要基于列表和两个用户。在创建合同时,我想检查合同是否已经存在,如果是,则将用户重新更正为创建的合同。以下是我视图中的代码:

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'

1 个答案:

答案 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是可选的,但是,嘿,为什么不优化通话?