Django - Фильтрация внешних ключей с использованием связанных свойств - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь отфильтровать таблицу в django на основе выбранной категории. Поле категории эквивалентно имени.

Я не могу осмыслить фильтрацию всех сообщений блога, которые ссылаются на этот идентификатор категории.

Сейчас я использую это: category_posts = BlogPost.objects.filter(category=cats).order_by('-published') Который я можно использовать без внешнего ключа. Я передаю строковую переменную в путь

Как я могу сделать это более эффективным и использовать внешний ключ, который связывает таблицу .. Примерно так: category_posts = Blogpost.objects.filter(category__category__contains=cat)

Я не знаю, усложняю ли я вещи, просто запутался

Доступны 2 таблицы:

name='Category',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('category', models.CharField(max_length=200)),
                ('summary', models.CharField(max_length=200)),
                ('slug', models.CharField(default=1, max_length=200)),
            ],
name='Blogpost',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('title', models.CharField(max_length=200)),
                ('content', models.TextField()),
                ('published', models.DateTimeField(default=datetime.datetime(2020, 7, 8, 20, 49, 14, 897634), verbose_name='date published')),
                ('slug', models.CharField(max_length=200)),
                ('category', models.ForeignKey(default=1, on_delete=django.db.models.deletion.SET_DEFAULT, to='blogposts.Category', verbose_name='Category')),
            ],

1 Ответ

2 голосов
/ 10 июля 2020

Ваш пример работал бы, если бы cat был строкой, и возвращал бы все сообщения блога, которые указывают на любую категорию, в имени которой есть кошка.

category_posts = Blogpost.objects.filter(category__category__contains="cat")

Если вы хотите отфильтровать специфику c категория, например,

cat = Category.objects.get(category="cat")

, тогда вы можете сделать это с помощью:

BlogPost.objects.filter(category=cat)

С точки зрения дизайна, может быть более понятным называть поле char, в котором хранится имя категории, просто " название". Тогда самый первый запрос будет выглядеть как BlogPost.objects.filter(category__name__contains="cat"), а второй cat = Category.objects.get(name="cat").

...