删除具有结束日期的多个用户

时间:2016-03-15 14:42:00

标签: django django-models

我有用户在合同结束日期+ 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()
    ...

我需要使用哪些过滤器选项/选项才能使其正常工作?非常感谢帮助!

2 个答案:

答案 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。