Django:让所有模型都依赖于用户?

问题描述

我有多模型用于非常不同的事情。现在我已经使用 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 还可用于 CreateViewUpdateView 以自动设置创建/更新对象的所有者。

然后您可以在 ListViewDetailView 等中使用这些:

class ImageListView(OwnedMixin,ListView):
    # …

class DeviceDetailView(OwnedMixin,DetailView):
    # …

class ThingCreateView(OwnedMixin,CreateView):
    # …