在数据库中进行第一次查询后,我想将布尔字段设置为false

时间:2019-06-18 12:09:42

标签: python django

我正在尝试实现一种机制,即在查询后仅对数据库执行1个查询,数据库中的布尔值字段会将其状态从true更改为false。我不知道该怎么做到。

模型

/path/on/host/

我正在使用get请求来查询数据库中的代码字段。

查看

class Code(models.Model):
    best_before = models.DateTimeField(auto_now=True)
    expiry_date = models.DateTimeField(auto_now=True)
    code = models.CharField(max_length=8, blank=True, unique=True)
    status = models.BooleanField(blank=True, default=False)

2 个答案:

答案 0 :(得分:2)

您可以这样做:

query = request.GET.get('q', None)
if query:
    info.filter(code__exact=query).update(status=False)

更新

正如@brunoDesthuilliers所说,从技术上讲a GET request must be idempotent,这意味着每次您发出GET请求时,每次响应都应该相同。简而言之,您不应在GET请求中进行更新。而且坦率地说,使用GET请求进行更新并不安全。现在,您可以使用POST请求。您可以检出使用表单进行POST请求的django's documentation。我将提供一个简短的示例:

# template (drugs/form.html)
<form action="/your-url/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="OK">
</form>

# form

from django import forms

class QueryForm(forms.Form):
    query = forms.CharField(label='Query', max_length=100)

# view

def index(request):
    form = QueryForm(request.POST or None)
    if request.method == 'POST' and form.is_valid():
        query = form.cleaned_data.get('query')
        info = Code.objects.all()  
        info = info.filter(code__exact=query)
        info.update(status=False)
        context = {
          'info':info,
          'query':query
         }

         return render(request, 'drugs/index.html', context)
    else:
        return render(request, 'drugs/form.html', {'form': form})

答案 1 :(得分:-1)

简单的答案就是在您的视图中执行。

    if query:
        info = info.filter(code__exact=query)
        if info[0].status:
            info[0].status = False
            info[0].save()

您是否正在寻找更复杂的东西?也许是在模型的后台进行的?