我需要维护一个筛选和排序的对象列表,最好是以通用的方式,可以在多个视图中使用。这是必要的,这样我就可以生成下一个,上一个链接,以及其他一些对用户非常有用的东西。
过滤器示例:
field__isnull=True
field__exact="so"
field__field__isnull=False此外,在构建过滤的查询集之后,任何字段都可以应用排序。
我当前的解决方案是使用一个包含过滤器集合的FilterSpec类,以及一个初始查询集。然后,这个类被序列化并传递给一个视图。
考虑一个包含25个动态筛选项的视图。视图中的每个项目都有一个链接,用于获取该项目的详细视图。将当前列表的序列化FilterSpec对象附加到每个链接。所以你最终得到了巨大的urls。更糟糕的是,同样巨大的过滤器被附加到所有25个链接上!
另一种选择是将FilterSpec存储在会话中,但是您会遇到何时删除FilterSpec的问题。接下来,您会发现所有视图都被代码弄得乱七八糟,这些代码试图确定是否应该删除筛选器,以便为新的对象列表做准备。
我相信这个问题以前已经解决过了,所以我很乐意听到你们提出的其他解决方案。
发布于 2009-08-29 14:46:31
您已经确定了在web应用程序中维护特定于用户的状态的两种选择:将其存储在cookie/session中,或者通过URL传递它。我不相信会有第三颗“银弹”等着你去解决你的问题。
URL query-string选项的优点是可以将特定的视图状态添加为书签,以电子邮件形式发送给URL等。它还可以使视图代码更简单,但代价是需要一些额外的模板代码,以确保正确的查询字符串始终在链接上传递。
在某种程度上,您首选的解决方案可能取决于您想要的行为。例如,如果用户将项目详细信息视图的URL添加为书签(或通过电子邮件发送给朋友),您是希望该URL只引用项目本身,还是始终携带有关该项目来自哪个列表的信息?如果是前者,则使用会话数据。如果是后者,请将URL与查询字符串一起使用。
无论是哪种情况,我都相信您发现的“杂乱的视图”代码可以重构为优雅、干燥和不可见,就像您希望的那样。装饰器和/或基于类的视图可能会有所帮助。
发布于 2009-08-29 00:48:42
根据您想要执行的操作,您可能希望使用create a custom manager或添加new manager method。
在本例中,您将添加一个新的管理器,用于选择标记为已发布且日期在当前datetime之后的博客帖子。
from django.db import models
from datetime import datetime
class PublishedPostManager(models.Manager):
def get_query_set(self):
return super(PublishedPostManager, self).get_query_set().filter(published=True, time__lt=datetime.now())
class Post(models.Model):
title = models.CharField(max_length=128)
body = models.TextField()
published = models.BooleanField(default=False)
time = models.DateTimeField()
objects = models.Manager() # Needed to ensure that the default manager is still available
published = PublishedPostManager()然后,您可以使用Post.published.all()来获取所有记录,而不是Post.objects.all()。普通的QuerySet方法也是可用的:
Post.published.count()
Post.published.select_related().filter(spam__iexact='eggs')
# etc当然,您仍然可以使用默认管理器:
Post.objects.all()https://stackoverflow.com/questions/1349840
复制相似问题