我有用户在合同结束日期+ 2个月后被删除。我的意思是,如果用户有2016/03/15的结束日期,我想在日期为2016/05/15 或更多时删除他。我想过使用过滤器选项,但我不确定应该设置过滤器的条件。
我有一个模型用户
class User(models.Model):
username = models.CharField(unique=True, primary_key=True)
...
还有一个模型,我们存储的东西就像创建的一样,由....修改和结束日期
class AccessTimes(models.Model):
username = models.ForeignKey(User, db_column='username')
...
endtime = models.DateTimeField(null=True, blank=True)
...
这是我目前的观点:
def delete_multiple_users(request):
"""
Deletes the users in a certain timespan and revokes all grants
"""
users = User.objects.filter(???).delete()
...
我需要使用哪些过滤器选项/选项才能使其正常工作?非常感谢帮助!
答案 0 :(得分:2)
您可以使用timedelta
。这将删除endtime
超过2个月之前的所有用户。由于AccessTimes
的ForeignKey为User
,您还必须使用reverse relationships:
import datetime
# date 2 months ago
delete_date = datetime.date.today() - datetime.timedelta(2*365/12)
User.objects.filter(accesstimes__endtime__lte=delete_date).delete()
答案 1 :(得分:-1)
在AccessTimes类中使用名为username的字段作为ForeignKey to User类可能会让人困惑一段时间。用户名字段由User类声明,因此根据与此字段相关的class_name,名称字段的可读性更高。
class User(models.Model):
username = models.CharField(...)
# ...
class AccessTimes(models.Model):
user = models.ForeignKey(User)
# ...
通过ForeignKey将AccessTimes类的用户字段与User类相关联也会让人感到困惑。用户可能无法多次访问。完全取消AccessTimes类并使用UserProfile类而不是分配适当的参数不是一个坏主意。
class UserProfile(models.Model):
endtime = models.DateTimeField()
# ...
将UserProfile类与User类相关似乎很明显。
class UserProfile(models.Model):
user = models.OneToOneField(User)
endtime = models.DateTimeField()
# ...
由于UserProfile类,过滤用户要简单得多。
UserProfile.objects.filter(...)
过滤两个月结束的用户变得直观。
today = datetime.date.today()
two_months_ago = today - timedelta(days = 60)
users_to_delete = UserProfile.objects.filter(endtime__lt = two_months_ago)
希望它有所帮助。如果没有,请告诉我。 PLUR。