django删除最近的多对多条目

时间:2013-10-29 20:54:37

标签: django

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

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个结果之后的所有内容?这是否可以在不创建另一个字段的情况下跟踪所查看的配置文件的顺序?

2 个答案:

答案 0 :(得分:1)

请查看documentation on Querysets,了解有关如何执行此操作的详细信息。您可以使用order_by按日期对对象进行排序,并使用Python's array slicing syntax来限制结果数量。

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

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

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

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

我认为你需要做的是拥有一个中间模型 - Django允许你在多对多关系中使用第三个模型作为两个不同模型之间的中间模型。然后,您可以将查看的时间添加到该模型并以此方式存储。文档中有a good example

除非数据库空间可能是一个问题,否则我不会真的打扰删除旧版本,但如果您因任何原因需要,我猜您可以设置一个由创建的新视图触发的信号有一个函数可以删除除最近的25个以外的所有函数。

答案 1 :(得分:0)

Django没有跟踪为ManyToMany关系添加的日期,因此如果不添加字段,则无法可靠地执行此操作。要实现这一点,您需要做的是在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')