Проблема с запросами в объекте Q («работает», но не всегда) - PullRequest
0 голосов
/ 15 октября 2019

Я использую объект Q в области ввода поиска. У меня есть много полей для проверки в области поиска, поэтому я использую OR (|) в своем запросе. Иногда это работает, иногда я не имею в виду, я проверяю поиск по полю -> эторабота У меня появилось новое поле в запросе, и оно больше не работает ...

Я проверяю свой код, возвращаюсь и проверяю снова, но я не понимаю, что не так

@login_required
def liste_participantes(request):
    """ A view to list participants. """

    liste_existe = True
    if request.POST:
        ide = request.POST.get('ide', False)
        try:
#           Participante.objects.get(pat_ide_prn_cse=ide)
            Participante.objects.get(
                Q(pat_ide_prn_cse=ide) | Q(pat_nom=ide) | Q(pat_pre=ide) | Q(pat_pti_nom_001=ide) | Q(pat_pti_nom_002=ide) | Q(pat_nai_dat=ide)
            )
        except:
            liste_existe = False
        else:
#           participantes = Participante.objects.filter(pat_ide_prn_cse=ide)
            participantes = Participante.objects.filter(
                Q(pat_ide_prn_cse=ide) | Q(pat_nom=ide) | Q(pat_pre=ide) | Q(pat_pti_nom_001=ide) | Q(pat_pti_nom_002=ide) | Q(pat_nai_dat=ide)
            )
    else:
        participantes = Participante.objects.all()
    return render(request, 'participante/liste_participantes.html', locals())

ни одно из полей не работает, но если я подавляю последнее поле (Q (pat_nai_dat = ide) и запускаю снова, все поля работают !!!

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

В вашем try-кроме вы не указываете тип исключения, поэтому выявляется любая ошибка. Вероятно, происходит то, что для некоторых входных данных ошибка генерируется и ловко перехватывается универсальным except.

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

try:
   # ...
except Partecipante.DoesNotExist:
   # ...
else:
   # ...

Кроме того, мне кажется, что цель вашего блока try-exc-else состоит в том, чтобы проверить, соответствует ли ваш поискдает какие-либо результаты или нет, вы можете упростить это так:

participantes = Participante.objects.filter(
    Q(pat_ide_prn_cse=ide) | Q(pat_nom=ide) | Q(pat_pre=ide) | Q(pat_pti_nom_001=ide) | Q(pat_pti_nom_002=ide) | Q(pat_nai_dat=ide)
)
if not participantes:
    liste_existe = False

Таким образом, вы запрашиваете базу данных только один раз.

0 голосов
/ 16 октября 2019

Я решаю свою проблему, используя регулярное выражение для даты, благодаря ошибке за его помощь

@login_required
def liste_participantes(request):
    """ A view to list participants. """

    liste_existe = True
    if request.POST:
        ide = request.POST.get('ide', False)

        if re.match(r'^[0-9]{4}',ide):
            participantes = Participante.objects.filter(Q(pat_nai_dat=ide) | Q(pat_inc_datadmin=ide))
        else:
            participantes = Participante.objects.filter(Q(pat_ide_prn_cse__startswith=ide) | Q(pat_nom__startswith=ide) | Q(pat_pre__startswith=ide) | Q(pat_pti_nom_001__startswith=ide) | Q(pat_pti_nom_002__startswith=ide) | Q(pat_con_tel_001__startswith=ide) | Q(pat_con_tel_002__startswith=ide))
        if not participantes:
            liste_existe = False
    else:
        participantes = Participante.objects.all()
    return render(request, 'participante/liste_participantes.html', locals())
0 голосов
/ 15 октября 2019

'' 'Класс Python Participante (SafeDeleteModel): "" "Класс для создания экземпляра участника." ""

_safedelete_policy = SOFT_DELETE_CASCADE
pat_ide = models.AutoField(primary_key=True)
pat_ide_prn_cse = models.CharField("Identifiant Princesse",
    max_length=14,
    validators = [
        RegexValidator(
            regex='^SP[M|F][0-9]{11}$',
            message= 'L\'identifiant doit être au format requis',
            code='invalid_participant_id'
        ),
    ],
    unique=True
    )
pat_inc_dat = models.DateField("Date d'inclusion")
pat_nom = models.CharField("Nom", max_length=100, blank=True)
pat_pre = models.CharField("Prénom", max_length=100, blank=True)
pat_pti_nom_001 = models.CharField("Surnom / Petit nom", max_length=100, blank=True)
pat_pti_nom_002 = models.CharField("Second petit nom (optionnel)", max_length=100, blank=True)
pat_nai_dat = PartialDateField("Date de naissance(YYYY-MM-JJ ou YYYY-MM ou YYYY)",
    default=None)
pat_inc_age = models.IntegerField(editable=False)
pat_ide_apr = models.CharField("Numéro patient interne Aprosam", max_length=100, blank=True)
pat_ide_phv = models.CharField("Numéro national Population HautementVulnérable(PHV)",
    max_length=100, blank=True)
pat_ide_pvh = models.CharField("Numéro national PVVIH", max_length=100, blank=True)
pat_lie_hab = models.CharField("Lieu d'habitation", max_length=100, blank=True)
pat_con_nom = models.CharField("Nom Prénom", max_length=100, blank=True)
pat_con_adr = models.CharField("Adresse", max_length=100, blank=True)
pat_con_tel_001 = models.CharField("Téléphone 1", max_length=100, blank=True)
pat_con_tel_002 = models.CharField("Téléphone 2", max_length=100, blank=True)
pat_not_opt = models.CharField("Notes", max_length=2000, blank=True)```
...