0

在我的 Django 应用程序中,我希望允许用户查看他们查看的配置文件以及查看它们的配置文件。在我的Profile模型中,我创建了 2 个字段来完成此任务。

viewed = models.ManyToManyField('self', null=True, blank=True, related_name='viewed_profiles', symmetrical=False)
visitors = models.ManyToManyField('self', null=True, blank=True, related_name='visitors_profiles', symmetrical=False)

我还在我的 views.py 文件中设置了代码,以根据需要将配置文件添加到这些字段。但是,我只想跟踪和显示最近 25 条左右的查看和访问者资料。有没有办法查询这些按添加日期排序的字段并删除前 25 个结果之后的所有内容?如果不创建另一个字段来跟踪查看的配置文件的顺序,这是否可能?

4

2 回答 2

1

查看有关查询集的文档以了解如何执行此操作的详细信息。您可以使用order_by按日期对对象进行排序,并使用Python 的数组切片语法来限制结果的数量。

在视图中显示最近添加的项目的示例可能如下所示:

viewed = Profile.objects.order_by("-date_added")[:25]

这不会删除 25 之后的所有内容 - 它只是获取 25 个最近的对象(假设您的 Profile 模型有一个名为 的字段date_added)。

编辑:哎呀,我想我误读了你的问题。

我认为您需要做的是有一个中间模型 - Django 允许您使用第三个模型作为多对多关系中两个不同模型之间的中间模型。然后您可以将查看的时间添加到该模型并以这种方式存储。文档中有一个很好的例子

除非数据库空间可能是一个问题,否则我不会真正打扰删除旧的,但如果您出于任何原因需要,我想您可以设置一个由正在创建的新视图触发的信号并进行调用删除除 25 个最近的所有内容的函数。

于 2013-10-29T21:30:48.307 回答
0

Django 不跟踪为多对多关系添加的日期,因此如果不添加字段就不可能可靠地执行此操作。为此,您需要在 ManyToMany 中间表上添加一个日期字段,然后按该字段排序 - 例如

class ProfileViewed(models.Model):
    viewed = models.ForeignKey('Profile')
    viewer = models.ForeignKey('Profile')
    date_added = models.DateField(auto_now_add=True)

class Profile(models.Model):
    ...
    viewed = models.ManyToManyField('self', null=True, blank=True, related_name='viewed_profiles', symmetrical=False, through=ProfileViewed)

然后你可以像这样订购你的结果:

profile = Profile.objects.get(...)
views = ProfileViewed.objects.filter(viewed=profile).order_by('date_added')
于 2013-10-29T21:46:52.687 回答