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 也可用于 CreateViewUpdateView 以自动设置 created/updated 对象的所有者。

然后您可以在 ListViews、DetailViews 等中使用这些:

class ImageListView(<b>OwnedMixin</b>, ListView):
    # …

class DeviceDetailView(<b>OwnedMixin</b>, DetailView):
    # …

class ThingCreateView(<b>OwnedMixin</b>, CreateView):
    # …