我正在尝试实现一种机制,即在查询后仅对数据库执行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)
答案 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()
您是否正在寻找更复杂的东西?也许是在模型的后台进行的?