python - 未发送 JSON 数据 - Django Rest Framework / React
问题描述
所以,我是 Django 的新手,经过数小时的搜索/尝试不同的事情,我无法弄清楚这一点。
我有一个表单,可以将我的组件状态提交给 api,将值添加到数据库中,然后将它们显示在表格中。除“项目”字段外,所有内容都进入数据库。当我查看 React Dev 工具时,我期望的值是我的状态。
project: 3
但是在我提交表单后,返回的值显示为空。
project: null
我真的不确定为什么该值为空。
这是我的models.py
class Completed(models.Model):
completed = models.BooleanField(default=False)
url = models.CharField(max_length=100)
handle = models.CharField(max_length=30)
filename = models.CharField(max_length=100)
size = models.IntegerField()
source = models.CharField(max_length=50)
uploadId = models.CharField(max_length=50)
originalPath = models.CharField(max_length=50)
owner = models.ForeignKey(
User, related_name="completed", on_delete=models.CASCADE, null=True)
project = models.ForeignKey(
Project, related_name="projectId", on_delete=models.CASCADE, null=True)
uploadDate = models.DateTimeField(auto_now_add=True)
这是项目模型
class Project(models.Model):
projectCode = models.CharField(max_length=10)
projectName = models.CharField(max_length=100)
user = models.ForeignKey(
User, related_name="projects", on_delete=models.CASCADE, null=True)
editor = models.ForeignKey(
User, on_delete=models.CASCADE, null=True)
creationDate = models.DateTimeField(auto_now_add=True)
completedDate = models.DateTimeField(null=True, blank=True)
dueDate = models.DateTimeField(null=True, blank=True)
def __str__(self):
return f"{self.projectName}"
这是序列化程序
# Project Serializer
class ProjectSerializer(serializers.ModelSerializer):
class Meta:
model = Project
fields = [
'id',
'projectCode',
'projectName',
'user'
]
depth = 1
# Completed Serializer
class CompletedSerializer(serializers.ModelSerializer):
# project = ProjectSerializer()
class Meta:
model = Completed
fields = [
'completed',
'url',
'handle',
'filename',
'size',
'source',
'uploadId',
'originalPath',
'owner',
'project',
'uploadDate'
]
depth = 1
我尝试将 ProjectSerializer 添加到 CompletedSerializer 中,但它给了我一个 400 bad-request 错误。
这是视图集
class CompletedViewSet(viewsets.ModelViewSet):
permission_classes = [
permissions.IsAuthenticated
]
serializer_class = CompletedSerializer
def get_queryset(self):
queryset = self.request.user.completed.all().filter(completed=True)
return queryset
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
谁能告诉我我在这里做错了什么?
解决方案
您正在depth=1
序列化程序上使用。这意味着您将为您的ForeignKey
. 默认情况下,嵌套序列化程序是只读的。如果您想要一个可写的嵌套序列化程序,您必须取消注释# project = ProjectSerializer()
并CompletedSerializer
传递所有数据以创建项目实例。我不认为这是你想要的。如果我理解得很好,您只想引用现有项目。因此,在我看来,实现这一目标的最佳方法是删除depth
你的CompletedSerializer
. 如果您在列出或检索 Completed 实例时需要该项目,请根据请求操作使用不同的序列化程序。这里有关可写嵌套序列化程序的更多详细信息https://www.django-rest-framework.org/community/3.0-announcement/#writable-nested-serialization。
对于使用不同的序列化程序,这是一个参考。在您的 ViewSet 中添加此代码:
def get_serializer_class(self):
if self.action == 'list' or self.action == 'retrieve':
return CompletedNestedSerializer
return CompletedSerializer