我是否需要为我拥有的每个模型添加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 自动设置创建/更新对象的所有者。
那么您可以在ListViews、DetailViews 等中使用这些:
class ImageListView(OwnedMixin, ListView):
# …
class DeviceDetailView(OwnedMixin, DetailView):
# …
class ThingCreateView(OwnedMixin, CreateView):
# …