我有一个Person列表,每个列表都有多个字段,通常使用object_list通用视图来过滤正在处理的内容。每个人都可以附加多个Comment,每个Comments.objects.filter()都有一个日期时间和一个文本字符串。我最终想要做的是可以选择基于日期过滤评论。

class Person(models.Model):
    name = models.CharField("Name", max_length=30)
    ## has ~30 other fields, usually filtered on as well

class Comment(models.Model):
    date = models.DateTimeField()
    person = models.ForeignKey(Person)
    comment = models.TextField("Comment Text", max_length=1023)


我想做的就是获取一个查询集

Person.objects.filter(comment__date__gt=date(2011,1,1)).order_by('comment__date')


将该查询集发送到object_list,并且只能看到按日期排序的注释,而页面上只有这么多的对象。

例如,如果“人员A”有评论12/12 / 2010、1 / 2 / 2011、1 / 5/2011,“人员B”没有评论,而人员C对1/3/2010有评论,我会看到:

"Person A",   1/2  - comment
"Person C",   1/3  - comment
"Person A",   1/5  - comment


我强烈希望不必切换到基于Person的过滤,因为这将使我不得不在视图和模板中大量重复大部分代码。

现在,如果我尝试执行以下命令,我将返回一个查询集(PersonA,PersonC,PersonA),但是如果我尝试在模板中呈现每个人,则comment_set将包含其所有注释,即使它们不在日期中范围。

理想情况下,应该具有某种功能,可以将comment_set查询集的扩展为更大的查询集,该查询集可以基于注释进行排序和排序,并放入object_list通用视图中。使用JOIN在SQL中执行此操作通常非常简单,但我不想放弃在其他任何地方使用的ORM。



好的,我的解决方案基本上只是Comments.objects.filter();将模板拆分为一个单独的文件,以适当的方式包含该文件,并应用额外的上下文布尔值(如果comment_date_filter,则在视图中的所有人员引用之前应用适当的前缀字符串(即“”或“ person__”):

{% if comment_date_filter %}
   {% for obj in object_list %}
      {% with obj.person as p %}
        {% include "object_list_row.html" %}
      {% endwith %}
   {% endfor %}
{% else %}
   {% for obj in object_list %}
      {% with obj as p %}
        {% include "object_list_row.html" %}
      {% endwith %}
   {% endfor %}
{% endif %}

最佳答案

您还有另一个选择是将所有对象提取为(Person, Date, Comment)元组,并在Python中对其进行排序。

但是,我不知道您不想使用Comment.objects.filter()的原因是什么。这可能会很快,尤其是在索引了日期字段的情况下。

关于python - django类似的查询集扩展,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4610010/

10-13 01:18