我有很多不同的模型。现在,我使用django-allauth添加了用户身份验证。我要做的是使所有模型都依赖于用户。我的意思是,只有用户才能看到他们自己存储的模型数据。实现此目标的最佳方法是什么?我需要为每个模型添加一个ForeignKey吗?
model.py:
class images(models.Model):
...
class things(models.Model):
...
class devices(models.Model):
...
class messages(models.Model):
...
#and so on...
我是否需要为
ForeignKey
每个模型添加一个?
是的,但是您不必更改所有模型,可以使用抽象的基本模型:
from django.conf import settings
class OwnedModel(models.Model):
owner = models.ForeignKey(
settings.AUTH_USER_MODEL,
on_delete=models.CASCADE
)
class Meta:
abstract = True
然后在所有子类中使用它:
class Image(OwnedModel, models.Model):
# …
pass
class Thing(OwnedModel, models.Model):
# …
pass
class Device(OwnedModel, models.Model):
# …
pass
class Message(OwnedModel, models.Model):
# …
pass
在您的视图中,您将不得不过滤用户。在基于类的视图上,您可以使用mixin轻松做到这一点:
from django.contrib.auth.mixins import LoginRequiredMixin
class OwnedMixin(LoginRequiredMixin):
def get_queryset(self, *args, **kwargs):
return super().get_queryset(*args, **kwargs).filter(
owner=self.request.user
)
def form_valid(self, form):
form.instance.owner = self.request.user
return super().form_valid(form)
该mixin也可以用于和,CreateView
并UpdateView
自动为创建/更新的对象设置所有者。
那么您可以在ListView
s,DetailView
s等中使用这些:
class ImageListView(OwnedMixin, ListView):
# …
class DeviceDetailView(OwnedMixin, DetailView):
# …
class ThingCreateView(OwnedMixin, CreateView):
# …
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句