Django按主键排序不起作用

时间:2018-09-04 17:26:48

标签: python django

我的模型如下:

class Photos(models.Model):
    id = models.IntegerField(primary_key=True, default=1)
    name = models.CharField(max_length=500)
    size = models.IntegerField()
    path = models.CharField(max_length=500)
    date = models.DateField(default=datetime.now)

    def __str__(self):
        return self.date.strftime('%Y-%m-%d')

    class Meta:
        verbose_name_plural = "Photos"

我要从数据库(PostgreSQL)中检索最后一个主键,如下所示:

try:
    last_inserted = Photos.objects.order_by('-id')[0]
    print(last_inserted)
except IndexError:
    print("No data in the database")

但是我总是从date列中获得一个日期,而不是主键,这真的很奇怪!打印last_inserted给我'2018-09-04'。 作为测试,我将“ id”列更改为lang(表中不存在)给出以下错误消息:

Cannot resolve keyword 'lang' into field. Choices are: date, id, name, path, size

在以上消息中,为什么日期先出现然后是id,依此类推..!

请帮助!

2 个答案:

答案 0 :(得分:1)

print(last_inserted)将向您显示模型的__str__方法的结果。要查看id,可以更改模型:

class Photos(models.Model):
    id = models.IntegerField(primary_key=True, default=1)
    name = models.CharField(max_length=500)
    size = models.IntegerField()
    path = models.CharField(max_length=500)
    date = models.DateField(default=datetime.now)

    def __str__(self):
        return str(self.id)

    class Meta:
        verbose_name_plural = "Photos"

或者仅更改查询以使用values_list仅选择id字段:

last_inserted = Photos.objects.order_by('-id').values_list('id', flat=True)[0]
print(last_inserted)

至于

  

在以上消息中,为什么日期先出现然后是id,依此类推..!

我想是因为字母顺序。

答案 1 :(得分:0)

您也可以这样尝试。短一点

Photos.objects.order_by('-id').first().id

还有一个last()

相关问题