【问题标题】:Django: make all models user dependent?Django:让所有模型用户依赖?
【发布时间】:2021-04-11 15:05:08
【问题描述】:

我有很多不同的模型。现在我使用 django-allauth 添加了用户身份验证。我想要做的是让所有模型用户依赖。我的意思是只有用户才能看到他们自己存储的模型数据。实现这一目标的最佳方法是什么?我需要为我拥有的每个模型添加一个 ForeignKey 吗?

模型.py:

class images(models.Model):
    ...

class things(models.Model):
    ...

class devices(models.Model):
    ...

class messages(models.Model):
    ...

#and so on...

【问题讨论】:

    标签: django django-models django-authentication


    【解决方案1】:

    我是否需要为我拥有的每个模型添加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 自动设置创建/更新对象的所有者。

    那么您可以在ListViews、DetailViews 等中使用这些:

    class ImageListView(OwnedMixin, ListView):
        # …
    
    class DeviceDetailView(OwnedMixin, DetailView):
        # …
    
    class ThingCreateView(OwnedMixin, CreateView):
        # …

    【讨论】:

      猜你喜欢
      • 2014-03-16
      • 1970-01-01
      • 2012-03-23
      • 2018-01-31
      • 1970-01-01
      • 2014-07-02
      • 2016-03-10
      • 1970-01-01
      • 2019-06-05
      相关资源
      最近更新 更多