Django sql .raw фильтрация по строке не работает

Я пытаюсь фильтровать по внешнему ключу, но получаю ошибку. Текущий код таков:

Views.py
def kingmailboxcodesshow(request):
    lname = "King"
    lockbox_list = MailBoxCodes.objects.raw('SELECT * FROM mailboxcodes WHERE Address_id__contains %s',[lname])
    return render(request,"users/mailboxcodesshow.html",{'MailBoxCodes':lockbox_list})

получаю эту ошибку:

django.db.utils.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''King'' at line 1")

Я все еще очень новичок в django и python, глядя на ошибку, я думаю, что мне нужно несколько меньше ' вокруг King, но я не уверен, как это сделать.

У меня есть куча адресов в Address_id, и я просто хочу получить все адреса с work King в их уличном адресе.

Я буду очень признателен за любую помощь.

Заранее спасибо.

Прекрасно в Django то, что вам не нужны необработанные SQL-запросы, если только вы действительно не знаете, что делаете. Пожалуйста, следуйте официальному учебнику, поскольку он объясняет основы Django и поможет вам в этом: Django tutorial

Чтобы помочь вам в этом конкретном вопросе:

def kingmailboxcodesshow(request):
    lname = "King"
    lockbox_list = MailBoxCodes.objects.filter(address__name__contains=lname)
    return render(request,"users/mailboxcodesshow.html",{'MailBoxCodes':lockbox_list})

В SQL нет такого понятия, как __contains, это просто некоторая логика Django, которая преобразует его в запрос, с которым вы можете работать:

def kingmailboxcodesshow(request):
    lname = 'King'
    lockbox_list = MailBoxCodes.objects.raw(
        'SELECT * FROM mailboxcodes WHERE Address_id LIKE %%%s%%', (lname,)
    )
    return render(
        request, 'users/mailboxcodesshow.html', {'MailBoxCodes': lockbox_list}
    )

При этом использование сырых запросов должно быть последним средством: вся идея ORM в Django заключается, как вы выяснили из этого вопроса, в абстракции логики запросов. Вы можете выполнить это с помощью:

def kingmailboxcodesshow(request):
    lname = 'King'
    lockbox_list = MailBoxCodes.objects.filter(Address_id__contains=lname)
    return render(
        request, 'users/mailboxcodesshow.html', {'MailBoxCodes': lockbox_list}
    )

Поделитесь, пожалуйста, вашей MailBoxCodes моделью, а также расскажите, что это за Address_id, поскольку вы упомянули, что это внешний ключ в одном из комментариев выше.

Попробуйте это:

def kingmailboxcodesshow(request):
    lname = 'King'
    lockbox_list = MailBoxCodes.objects.filter(Address_id__name__contains=lname)
    return render(
        request, 'users/mailboxcodesshow.html', {'MailBoxCodes': lockbox_list}
    )

Вы также можете использовать __icontains поиск для фильтрации без учета регистра.

Я хочу поблагодарить всех за помощь. В итоге все работает идеально.

class OneLesterStreetMailBoxCodesListView(ListView):
    queryset = MailBoxCodes.objects.filter( Address__Address1__icontains="251 -")
    context_object_name = '251mailboxcodes'
    template_name = 'mailboxcodes/251_index.html'

( Address__Address1__icontains="251 -")<-- Address - имя поля в таблице MailBoxCodes, Address1 - имя поля в таблице внешних полей.

Надеюсь, эта информация поможет кому-то еще в будущем.

Вернуться на верх