Python Django:查询数据库

Python Django:查询数据库,python,database,django,pagination,Python,Database,Django,Pagination,我有这个型号 class messages(models.Model): status_choices = ( (u'read',u'read'), (u'unread',u'unread') ) user = models.ForeignKey(User) message = models.TextField() status = models.CharField(max_length=6,choices=stat

我有这个型号

class messages(models.Model):
    status_choices = (
        (u'read',u'read'),
        (u'unread',u'unread')
        )
    user = models.ForeignKey(User)
    message = models.TextField()
    status = models.CharField(max_length=6,choices=status_choices,default='unread')
    sender = models.ForeignKey(User,related_name="sender")

现在,我只想获取属于“user1”的前10条消息,在第二次请求时获取接下来的10条消息,依此类推。我如何才能做到这一点?

Django已经通过一个对象提供了此功能。在URL中,您需要一个
页面
参数,该参数说明您在哪个页面上,并且在您的视图中,您需要构造一个
分页器
对象。您需要指定页面上对象的数量(在您的示例中为10),剩下的工作将由
分页器来完成

例如,以下代码将打印第3页上显示的所有实例:

from django.core.paginator import Paginator

objects = messages.objects.all()
p = Paginator(objects, 10)
page3 = p.page(3)
print page3.object_list
文档给出了如何实现视图以及如何将对象列表传递给模板的示例。

首先是两件事

  • 您的模型应该大写(常规)
  • “消息”是contrib软件包的一部分,如果尝试同时使用contrib消息和应用程序消息,则不使用名称空间的将引发冲突(https://docs.djangoproject.com/en/dev/ref/contrib/messages/#module-django.contrib.messages)
编辑
删除了我的代码示例,碰撞了Simeon Visser的解决方案

好的,我对分页这件事有疑问。请求某些页面是否会触发数据库访问,或者数据库只被访问一次,即在创建分页对象时。请不要有疑问。Paginator很棒。Django querysets是懒惰的
messages.objects.all()
在paginator访问数据库的计算之前不会调用数据库。基本上,每个请求一次对DB的调用。
消息
不保留。Django messages contrib软件包使用它,是的,但您仍然可以在自己的应用程序中使用它。这就是模块名称空间发挥作用的地方。如果需要使用Django的消息,只需不将其转储到全局名称空间,而是执行类似于从Django.contrib.messages导入模型作为messages\u models
的操作,然后在代码中使用
messages\u models.Message
。如果你不能仅仅因为其他人在某处创建了使用相同类名的包而使用类名,那么我们就没有类名了。@Chris Pratt:谢谢你抓住了这个问题,我说错了。然而,我仍然认为,为了避免混淆和提高可维护性,最好不要重用表示核心框架类的类名。我会把它命名为PrivateMessage或UserMessage或一些变体。是的,这就是名称空间的作用,但在某些情况下,当您快速尝试消化代码时,您会失去清晰性。当然,您可能会有一场关于是否应该这样做的另一场辩论,事实上,我非常同意您的看法:如果可以避免的话,我认为您不应该这样做。另一方面,指出contrib包标记为contrib也是有原因的,这一点也很重要。完全不使用它们而完全出于相同目的使用另一个库是完全可以接受的。在这种情况下,您可能会使用相同的类名。