запрос на выборку x, начинающуюся с буквы x, имеющей самый высокий x - PullRequest
1 голос
/ 21 января 2020

У меня есть 2 модели

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255)
    email = models.EmailField()

def __str__(self):
    return self.name

class Article(models.Model):
    title = models.CharField(max_length=120)
    description = models.TextField()
    body = models.TextField()
    author = models.ForeignKey('Author', related_name='articles', on_delete=models.CASCADE)

def __str__(self):
    return self.title

, что будет запросом для извлечения всех тех авторов, чье имя начинается с "а" и написано более 6 статей.

Ответы [ 2 ]

2 голосов
/ 21 января 2020

Вы можете сделать что-то вроде этого

Author.objects.annotate(count_articles=Count('articles')).filter(
    name__regex=r'^a+',
    count_articles__gt=6
)

Он аннотирует, а затем фильтрует, используя выражение регулярного выражения, а логика вашего приложения c больше 6.

2 голосов
/ 21 января 2020

Вы можете аннотировать QuerySet числом связанных Article с, а затем фильтровать, например:

from django.db.models import <b>Count</b>

Author.objects.annotate(
    narticle=Count('articles')
).filter(
    <b>name__startswith='a',
    narticle__gt=6</b>
)

Если имя может начинаться с A или a, вы может заменить поиск __startswith [Django -doc] на поиск __istartswith [Django -doc] .

В случае, если также достаточно шести статей, вы можете заменить __gt lookup [Django -doc] на __gte lookup [Django -doc] .

...