группа django по + отличной - PullRequest
       11

группа django по + отличной

0 голосов
/ 24 сентября 2018
from django.db import models
class Book(models.Model):
    name = models.CharField(max_length=100)
    author = models.CharField(max_length=100)
    published_years = models.DateField()
    concat = name + author 

Что такое запрос для получения книг по полю 'concat', без дублионов, и где ключ_публикации - самая последняя дата

Пример:

<table>
<tr><th>#id</th><th>name</th><th>author</th><th>published_years</th> </tr>
<tr><td>0</td><td>nameA</td><td>    author1</td><td>   1996</td></tr>
<tr><td>1</td><td>nameA</td><td>    author1</td><td>   1997</td></tr>
<tr><td>2</td><td>nameA</td><td>    author2</td><td>   1687</td></tr>
<tr><td>3</td><td>nameB</td><td>    author2</td><td>   1987</td></tr>
</table>
=>

<table>
<tr><td>1</td><td>   nameA</td><td>    author1  </td> <td>1997</td></tr>
<tr><td>2</td><td>   nameA</td><td>    author2  </td> <td>1687</td></tr>
<tr><td>3</td><td>   nameB</td><td>    author2  </td> <td>1987</td></tr>
</table>

1 Ответ

0 голосов
/ 24 сентября 2018

Запросы с помощью QuerySet словарей

Вы можете сделать запрос, например:

Book.objects.values('name', 'author').annotate(
    year=Max('published_years')
).order_by('name', 'author')

, что приведет к QuerySet, охватывающему dict ионариев, например:

<QuerySet [
    { 'name': 'titleA', 'author': 'authorA', 'year': date(1993, 2, 9)},
    { 'name': 'titleA', 'author': 'authorB', 'year': date(2008, 5, 7)},
    { 'name': 'titleB', 'author': 'authorC', 'year': date(1983, 1, 1)},
    { 'name': 'titleC', 'author': 'authorA', 'year': date(1923, 7, 15)},
]>

Рефакторинг и аннотирование

и затем вы можете их обработать, но, как указано в комментариях, если один и тот же name / author содержит несколько дубликатов, это означает, что у вас естьанти-шаблон с именем дублирование данных в вашей модели.Вы, вероятно, должны изменить его на:

class Author(models.Model):
    name = models.CharField(max_length=255)

class Book(models.Model):
    name = models.CharField(max_length=255)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

class BookDate(models.Model):
    book = models.ForeignKey(Book)
    date = models.DateField()

Тогда вы можете написать это как:

Book.objects.annotate(
    author_name=F('author__name')
    last_published=Max('bookdate__date')
)

, что является QuerySet из Book с (так что «более богатый»)) и с двумя дополнительными атрибутами: author_name и last_published уже доступны.

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