Django 删除多个具有结束日期的用户
我有一些用户,当他们达到合同结束日期+2个月时将被删除。我的意思是,如果一个用户拥有2016/03/15的结束日期,我想在该日期为2016/05/15或更多的时候删除他。我考虑过使用过滤器选项,但我不确定应该为过滤器设置什么条件 我有一个模范用户Django 删除多个具有结束日期的用户,django,django-models,Django,Django Models,我有一些用户,当他们达到合同结束日期+2个月时将被删除。我的意思是,如果一个用户拥有2016/03/15的结束日期,我想在该日期为2016/05/15或更多的时候删除他。我考虑过使用过滤器选项,但我不确定应该为过滤器设置什么条件 我有一个模范用户 class User(models.Model): username = models.CharField(unique=True, primary_key=True) ... 还有一个模型,我们把东西存储起来,比如创建的,修改的。。
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()
...
我需要使用哪些过滤器选项来实现此功能?非常感谢您的帮助 您可以为此使用
timedelta
。这将删除endtime
已超过2个月的所有用户。由于AccessTimes
具有指向User
的外键,因此您还必须使用:
在AccessTimes类中使用名为username的字段作为用户类的外键可能会让人困惑一段时间。用户名字段是由用户类声明的,所以根据与此字段相关的类名称命名字段更容易阅读
class User(models.Model):
username = models.CharField(...)
# ...
class AccessTimes(models.Model):
user = models.ForeignKey(User)
# ...
通过ForeignKey将AccessTimes类的用户字段和用户类相关联也可能会令人困惑。用户可能不会多次访问。完全退出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)
希望能有帮助。如果没有,请告诉我。普鲁尔 很抱歉反应太晚!我收到以下错误:
FieldError:无法将关键字“endtime”解析到字段中。选项包括:注释、创建、创建人、创建人id、修改、修改人、修改人id、用户名
。endtime字段位于AccessTime模型中。我们需要找到它。这有可能吗?对不起,错过了,这里面有一把外国钥匙。我更新了我的答案。您可以使用反向关系:
today = datetime.date.today()
two_months_ago = today - timedelta(days = 60)
users_to_delete = UserProfile.objects.filter(endtime__lt = two_months_ago)