我的问题是,如果我有一个网站,并且我让我的用户能够按照这种做法删除他们自己的帐户,那么一旦我的网站获得一些流量?
最终,是的。问题是,为什么会有这样的问题?。数据库通常在主键上构建索引,这意味着它通常可以有效地检索给定帖子对象的用户,即使存在一定数量的“死数据”。
删除用户的主要问题是经常有触发器会删除所有相关数据。事实上,假设你有一个Post 模型:
from django.conf import settings
class Post(models.Model):
author = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
这意味着如果您删除一个用户,它将删除该用户是作者的所有Post 对象,当然不仅是Posts,还有您使用CASCADE 链接到该用户的所有内容扳机。这可能不是预期的效果。通常,您希望保留用户构建的数据,除非用户(明确)要求这样做。
您可以定义视图让人们删除他们的帐户,可以是“软”删除(.is_active 设置为 False),也可以是“硬”删除(删除对象,让触发器波动) .您可以制作如下视图:
# soft delete
from django.contrib.auth import logout as auth_logout, get_user_model
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
@login_required
@require_http_method(['POST'])
def remove_account(request):
user_pk = request.user.pk
auth_logout(request)
User = get_user_model()
User.objects.filter(pk=user_pk).update(is_active=False)
# …
# return HTTP response
或硬删除:
# hard delete
from django.contrib.auth import logout as auth_logout, get_user_model
from django.contrib.auth.decorators import login_required
from django.views.decorators.http import require_http_methods
@login_required
@require_http_method(['POST'])
def remove_account(request):
user_pk = request.user.pk
auth_logout(request)
User = get_user_model()
User.objects.filter(pk=user_pk).delete()
# …
# return HTTP response
并在模板中添加一个删除帐户的按钮:
<form method="post" action="{% url 'name-of-delete-view' %}">
{% csrf_token %}
<button type="submit">delete account</button>
</form>
name-of-delete-view 是您在path(…, name=…) 或re_path(…, name=…) 中为视图指定的名称。