Django查询结果与if语句的比较

时间:2019-05-07 11:13:05

标签: python django if-statement web view

需要使用浏览器检查功能来检查浏览器的可变值,并在按钮中的url中输入随机ID,所以我并不是真正的django和东西。我对将要更新或删除的数据进行验证例如,由tenantid检查,我将对单条记录进行新闻更新,并且机制将检查记录tenantid是否等于我的租户ID。 问题是我无法将查询结果与int值进行比较。

如果有更好的方法,我很高兴听到,谢谢您的美好时光。

@login_required()  def customer_update(request, pk):
    customer = get_object_or_404(Customer, pk=pk)
    valueOwnerTenantid = Customer.objects.values_list('tenantid',   flat=True).filter(id=pk)
    print(valueOwnerTenantid)
    print(request.user.tenantid)
    print(valueOwnerTenantid.query)

    if number(valueOwnerTenantid) == number(request.user.tenantid):
        if request.method == 'POST':
            print('Equal and POST')
            form = CustomerForm(request.POST, instance=customer)
        else:
            print('Equal and Get')
            form = CustomerForm(instance=customer)
            return save_customer_form(request, form, 'customer_update_partial.html')
    else:

3 个答案:

答案 0 :(得分:4)

您只对单个值感兴趣,而不对值QuerySet感兴趣,因此在这里应使用.get(..)而不是.filter()。但是实际上,您甚至可以完全省略它,因为您已经在tenantid中检索了customer

因此,您的视图应如下所示:

@login_required()
def customer_update(request, pk):
    customer = get_object_or_404(Customer, pk=pk)
    if customer.tenantid == request.user.tenantid:
        # ...

话虽这么说,您在模型中存储id,而不是在某些ForeignKey模型中存储Tenant,这很奇怪。在没有{{1}的情况下进行引用} s通常不是一个好主意:例如,ForeignKey可能不是 指的是真正的租户。此外,默认情况下,Django不会在tenantid列中添加索引,从而使搜索具有给定tenantid的客户的计算量更大。

答案 1 :(得分:3)

如果要查找具有特定tenant_id的记录,则可以尝试类似的操作

my_tenant_id = request.user.tenantid
Customer.objects.filter(tenantid=my_tenant_id)

或威廉·范·昂塞姆(Willem Van Onsem)对单笔记录的建议

答案 2 :(得分:2)

Customer.objects.values_list('tenantid', flat=True).filter(id=pk)将返回列表,而不是单个值。 看起来您两次获得相同的Customer对象

您可以删除valueOwnerTenantid = Customer.objects.values_list('tenantid', flat=True).filter(id=pk)行,而仅使用customer.tennantid来获得tennantid

if customer.tennantid == request.user.tenantid:
   ...