问题描述
我有很多模型用于非常不同的事情。现在我已经使用 django-allauth 添加了用户身份验证。我想要做的是让所有模型都依赖于用户。我的意思是只有用户才能看到他们自己存储的模型数据。实现这一目标的最佳方法是什么?我是否需要为我拥有的每个模型添加一个外键?
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
、DetailView
等中使用这些:
class ImageListView(OwnedMixin,ListView):
# …
class DeviceDetailView(OwnedMixin,DetailView):
# …
class ThingCreateView(OwnedMixin,CreateView):
# …