Django:为每个(FK)打印模型的最后一个对象

时间:2019-05-08 00:20:59

标签: python django

我有两个模型:

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 :(得分:0)

您可能正在寻找以下内容:

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

也许nombre__icontains也会有用。

答案 1 :(得分:0)

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, )

答案 2 :(得分:0)

我认为,如果您使用PostgreSQL,则可以在tipo FK字段上使用distinct()建立查询。如果不是,请尝试使用last(),例如:

small_x = BillInitial.objects.filter(
        nombre='x'
    ).last()
big_x = BillInitial.objects.filter(
        nombre='X'
    ).last()