После первого запроса в базе данных, я хочу сделать логическое поле false - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь реализовать механизм, при котором только 1 будет сделан один запрос в базе данных после запроса, логическое поле в базе данных изменит свой статус с true на false.Я не знаю, как это сделать.

Модель

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)

И я использую запрос get для запроса поля кода в базе данных.

Просмотр

def index(request):
    info = Code.objects.all()
    query = request.GET.get('q')
    print(query)
    if query:
        info = info.filter(code__exact=query)
    context = {
      'info':info,
      'query':query
     }
    return render(request, 'drugs/index.html', context)

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Вы можете сделать это так:

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-запросы. Вы можете оформить django's documentation использования формы для запроса POST. Я приведу короткий пример:

# 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})
0 голосов
/ 18 июня 2019

Простой ответ - просто сделайте это на ваш взгляд.

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

Было ли что-то более сложное, что вы искали? Может быть, делать это под одеялом в модели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...