为什么 first() 方法和切片在 Django 中的工作方式不同?

问题描述 投票:0回答:1

我有型号:

class PhotoAlbum(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False, auto_created=True)
    name = models.CharField(max_length=50, verbose_name='Album name')
    type = models.ForeignKey(AlbumType, on_delete=models.CASCADE, verbose_name='Album type')
    created_at = models.DateTimeField(auto_now_add=True)

我有这个代码:

print(PhotoAlbum.objects.all().first())
print(PhotoAlbum.objects.all()[:1].get())

在我看来,应该显示相同的对象,但返回不同的对象。

怎么回事,这不是一模一样的设计吗?

python django django-queryset
1个回答
0
投票

如果查询集未排序,则 first() 按主键对查询集排序

from django.db import connection
Pet.objects.all().first()
print(connection.queries[-1]['sql'])
# SELECT ... FROM <table> ORDER BY <table>."id" ASC LIMIT 1

但是切片查询集不会执行这样的默认排序

from django.db import connection
Pet.objects.all()[:1].get()
print(connection.queries[-1]['sql'])
# SELECT ... FROM <table> ASC LIMIT 1
© www.soinside.com 2019 - 2024. All rights reserved.