Queryset - Как найти слово во внешнем ключе в django? - PullRequest
1 голос
/ 02 апреля 2020

Как найти слово во внешнем ключе?

Есть классы:

class Customers(models.Model):
    customer = models.CharField(max_length=255, unique=True)
    order =    models.ForeignKey('Order')

class Orders(models.Model):
    orderName = models.CharField(max_length=255)

В таблицах клиентов и заказов есть следующие записи:

Заказ:

+-----+------------------+
| id  | orderName        |
+-----+------------------+
| 1   | Apple juice      |
+-----+------------------+
| 2   | Apple pie        |
+-----+------------------+
| 3   | Banana juice     |
+-----+------------------+
| 4   | Banana pie       |
+-----+------------------+
| 5   | Apple ice cream |
+-----+------------------+
| ... | ...              |
+-----+------------------+

Клиент:

+-----+----------+-------+
| id  | Customer | Order |
+-----+----------+-------+
| 1   | A        | 2     |
+-----+----------+-------+
| 2   | B        | 3     |
+-----+----------+-------+
| 3   | C        | 2     |
+-----+----------+-------+
| 4   | G        | 1     |
+-----+----------+-------+
| 5   | H        | 1     |
+-----+----------+-------+
| ... | ...      | ...   |
+-----+----------+-------+

Я хочу получить в таблице клиентов все записи о том, что их заказы состоят из «Apple». Я написал эти коды:

all_apple_orders = Customer.objects.filter(order='Apple')

Я получил сообщение об ошибке:

Поле ожидало число, но получил 'Apple'.

Как следует изменить код?

Ответы [ 2 ]

4 голосов
/ 02 апреля 2020

Вы можете проверить, содержит ли orderName связанных объектов Orders это имя, например, с помощью:

all_apple_orders = Customer.objects.filter(<b>order__orderName__icontains='Apple'</b>)

или для случая чувствительного соответствия:

all_apple_orders = Customer.objects.filter(<b>order__orderName__contains='Apple'</b>)

или вы можете использовать регулярное выражение с границами слова:

all_apple_orders = Customer.objects.filter(<b>order__orderName__iregex=r'\bApple\b'</b>)

или если вы хотите совпадать только с заказами, которые имеют 'Apple':

all_apple_orders = Customer.objects.filter(<b>order__orderName='Apple'</b>)

или для сопоставления без учета регистра:

all_apple_orders = Customer.objects.filter(<b>order__orderName__iexact='Apple'</b>)
1 голос
/ 02 апреля 2020

Расширьте поиск ваших отношений с помощью __ (двойное подчеркивание)

all_apple_orders = Customer.objects.filter(order__orderName__icontains='Apple')

Ссылка: Поиск, охватывающий отношения

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