Django Сокращение значений набора запросов по умолчанию - PullRequest
0 голосов
/ 04 мая 2020

Я инициализирую переменные в None в качестве значения по умолчанию. Если набор запросов не возвращает объектов, программа не завершится с ошибкой.

Есть ли более короткий метод для этого? Спасибо

  qs_data = {
        'flal_id_no' : None,
        'mail_id_no' : None,
        'subject_id_no':None,
        'pdsbj_id_no':None,
    }

    qs = vFileAllocation.objects.values().filter(track_id_no=get_track_id_no)[0]

    if qs:
        qs_data['flal_id_no'] = qs['flal_id_no']
        qs_data['mail_id_no'] = qs['mlal_id_no']
        qs_data['subject_id_no'] = qs['subject_id_no']
        qs_data['pdsbj_id_no'] = qs['pdsbj_id_no']

1 Ответ

1 голос
/ 04 мая 2020

Basi c python или оператор ( можно вернуть значение по умолчанию, если нет ):

queryset[0] - получить первый объект из набора запросов результат, поэтому в случае, если совпадений не найдено - набор запросов будет содержать без элементов (queryset == <QuerySet[]>) и получение первого элемента из него [0] завершится ошибкой .

Правильный способ - использовать .first() в наборе запросов для его оценки и получения первого результата или None.

. Для этого примера это может быть однострочным:

qs_data = vFileAllocation.objects.values() \
    .filter(track_id_no=get_track_id_no) \
    .first() or qs_data

или

qs = vFileAllocation.objects.values() \
    .filter(track_id_no=get_track_id_no).first()
# qs is already evaluated
qs_data = qs or qs_data
  • Исправлен ответ благодаря комментарию @ csandreas1
...