Django:让所有模型都依赖于用户?
Django: make all models user dependent?
我有很多不同的模型。现在我已经使用 django-allauth 添加了用户身份验证。我想要做的是让所有模型都依赖于用户。我的意思是只有用户可以看到他们自己存储的模型数据。实现这一目标的最佳方法是什么?我需要为我拥有的每个模型添加外键吗?
model.py:
class images(models.Model):
...
class things(models.Model):
...
class devices(models.Model):
...
class messages(models.Model):
...
#and so on...
Do I need to add a ForeignKey
to each model I have?
是,但您不必更改所有模型,您可以使用抽象基础模型:
from django.conf import settings
class OwnedModel(models.Model):
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
class Meta:
abstract = True
然后在所有子classes:
中使用它
class Image(<b>OwnedModel,</b> models.Model):
# …
pass
class Thing(<b>OwnedModel,</b> models.Model):
# …
pass
class Device(<b>OwnedModel,</b> models.Model):
# …
pass
class Message(<b>OwnedModel,</b> models.Model):
# …
pass
在您的视图中,您必须对用户进行过滤。在基于 class 的视图上,您可以使用 mixin 轻松完成此操作:
from django.contrib.auth.mixins import LoginRequiredMixin
class OwnedMixin(LoginRequiredMixin):
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
<b>owner=self.request.user</b>
)
def form_valid(self, form):
form.instance.owner = self.request.user
return super().form_valid(form)
此 mixin 也可用于 CreateView
和 UpdateView
以自动设置 created/updated 对象的所有者。
然后您可以在 ListView
s、DetailView
s 等中使用这些:
class ImageListView(<b>OwnedMixin</b>, ListView):
# …
class DeviceDetailView(<b>OwnedMixin</b>, DetailView):
# …
class ThingCreateView(<b>OwnedMixin</b>, CreateView):
# …
我有很多不同的模型。现在我已经使用 django-allauth 添加了用户身份验证。我想要做的是让所有模型都依赖于用户。我的意思是只有用户可以看到他们自己存储的模型数据。实现这一目标的最佳方法是什么?我需要为我拥有的每个模型添加外键吗?
model.py:
class images(models.Model):
...
class things(models.Model):
...
class devices(models.Model):
...
class messages(models.Model):
...
#and so on...
Do I need to add a
ForeignKey
to each model I have?
是,但您不必更改所有模型,您可以使用抽象基础模型:
from django.conf import settings
class OwnedModel(models.Model):
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
class Meta:
abstract = True
然后在所有子classes:
中使用它class Image(<b>OwnedModel,</b> models.Model):
# …
pass
class Thing(<b>OwnedModel,</b> models.Model):
# …
pass
class Device(<b>OwnedModel,</b> models.Model):
# …
pass
class Message(<b>OwnedModel,</b> models.Model):
# …
pass
在您的视图中,您必须对用户进行过滤。在基于 class 的视图上,您可以使用 mixin 轻松完成此操作:
from django.contrib.auth.mixins import LoginRequiredMixin
class OwnedMixin(LoginRequiredMixin):
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
<b>owner=self.request.user</b>
)
def form_valid(self, form):
form.instance.owner = self.request.user
return super().form_valid(form)
此 mixin 也可用于 CreateView
和 UpdateView
以自动设置 created/updated 对象的所有者。
然后您可以在 ListView
s、DetailView
s 等中使用这些:
class ImageListView(<b>OwnedMixin</b>, ListView):
# …
class DeviceDetailView(<b>OwnedMixin</b>, DetailView):
# …
class ThingCreateView(<b>OwnedMixin</b>, CreateView):
# …