【问题标题】:React and Django - Connect the Note model with the specific UserReact 和 Django - 将 Note 模型与特定用户连接
【发布时间】:2021-09-26 13:13:54
【问题描述】:

我正在使用 react 和 django_rest_framework 创建一个笔记保存应用程序。

我的笔记模型 -

from django.db import models
from django.contrib.auth.models import User

class Note(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()

    def __str__(self):
        return self.title

Note 序列化器 -

from rest_framework import serializers
from .models import Note

class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ("id", "title", "content")

为了注册和登录,我在这里关注答案 - Answer

我用来存储笔记的反应代码 -

const requestOptions = {
       method: 'POST',
       headers: { 'Content-Type': 'application/json' },
       body: JSON.stringify({ title: this.state.title, content: this.state.note })
     };
     await fetch('http://localhost:8000/notes/', requestOptions);

现在,我如何将我的笔记对象连接到特定的登录用户,以便特定的笔记只对该用户可见?

这可以在 django 中使用 ForeignKey 来完成,但是如何在 django_rest_framework 中完成呢?

编辑 1

我遵循了@Abhyudai 给出的答案,但我收到了这个错误 -

django.db.utils.IntegrityError: NOT NULL constraint failed: notes_note.user_id

编辑 2

views.py -

from .serializers import NoteSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Note
from rest_framework import status

class NoteView(APIView):
    def get(self, request, format=None):
        notes = Note.objects.all()
        serializer = NoteSerializer(notes, many=True)
        return Response(serializer.data)

请帮忙。谢谢!

【问题讨论】:

  • 你能不能显示NoteSerializer views.py
  • @AliAref 添加了views.py

标签: javascript python reactjs django django-rest-framework


【解决方案1】:

您可能必须在Note model 上添加一个字段user

# models.py
from django.db import models
from django.conf import settings

class Note(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

...

然后在你的serializer

# serializers.py
from django.contrib.auth import get_user_model
from rest_framework import serializers
from .models import Note

class UserSerializer(serializers.ModelSerializer):
   class Meta:
       model = get_user_model()
       fields = ('id', 'username')
       lookup_field = 'username'

class NoteSerializer(serializers.ModelSerializer):
    user = UserSerializer(read_only=True)
    class Meta:
        model = Note
        fields = ("id", "title", "content")

您可以在serializing nested objects 阅读更多内容。

随着应用程序的增长,您可能希望将UserSerializer 移动到authusers 应用程序。

您必须创建一个permission 以确保只有创建笔记的用户才能查看该笔记。

这是其中一种方法。

# permissions.py
fromr rest_framework import permissions


class IsOwner(permissions.BasePermission):
    def has_object_permission(self, request, view, obj):
      if request.user: # note: this will prevent an unnecessary database query in case of unauthenticated user  
          return obj.user == request.user

您可以在permissions阅读更多内容。

对于视图,您可以使用类似于下面使用的内容。

# views.py
from rest_framework import generics, permissions
from .models import Note
from .serializers import NoteSerializer
from .permissions import IsOwner

class ListNoteView(generics.CreateAPIView):
    queryset = Note.objects.all()
    serializer_class = NoteSerializer
    permissions = (IsOwner,)

您可以在generics views 阅读更多内容。

【讨论】:

  • 我收到一个错误。有关详细信息,请参阅更新后的问题。
  • 您可能试图在不登录用户的情况下访问视图。在view 上使用权限is_authenticated
  • 好的,那我怎么把用户登录的django存进去呢?
  • 我已将views 添加到答案中。我认为这应该为你做。
  • 但是当我登录时,django 并没有让我保持登录状态,所以我无法访问它
猜你喜欢
  • 2021-01-13
  • 1970-01-01
  • 2022-01-07
  • 2022-07-31
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 2016-10-03
相关资源
最近更新 更多