Django: вывести последний объект модели для каждого (FK) - PullRequest
0 голосов
/ 08 мая 2019

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

class Mantipo(models.Model):   
    tipo = models.CharField(max_length=255)
    ...

class BillInitial(models.Model):
    tipo = models.ForeignKey(Mantipo, null=True, blank=True)
    nombre = models.CharField(max_length=255)
    ...

Допустим, у меня есть следующие объекты модели "BillInitial":

| id | tipo (FK) | nombre |

| 1 | uno | X | 

| 2 | dos | y | 

| 3 | cinco | x | 

| 4 | cinco | x |

| 5 | dos | z | 

| 6 | uno | X |

Я хочу вывести последние объекты nombre (X)как:

| id | tipo (FK) | nombre |

| 4 | cinco | x | 

| 6 | uno | X |

Ответы [ 3 ]

0 голосов
/ 08 мая 2019
later_items_per_nombre = BillInitial.objects.filter(
    nombre=OuterRef('nombre'), 
    tipo=OuterRef('tipo'),
    pk__gt=OuterRef('pk')
)

BillInitial.objects.filter(nombre='x',).\
    annotate(is_not_last=Exists(later_items_per_nombre), ).\
    filter(is_not_last=False, )
0 голосов
/ 09 мая 2019

Я думаю, что если вы используете PostgreSQL, вы можете создать запрос с distinct() в поле типо FK. Если нет, возможно, попробуйте с last() вроде:

small_x = BillInitial.objects.filter(
        nombre='x'
    ).last()
big_x = BillInitial.objects.filter(
        nombre='X'
    ).last()
0 голосов
/ 08 мая 2019

Вы, вероятно, ищете следующее:

BillInitial.objects.filter(nombre__iexact='x').order_by('-id')[:2]

Может быть nombre__icontains также будет полезно.

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