Django Rest框架-如何基于外键保存数据

Django Rest框架-如何基于外键保存数据,django,django-models,django-rest-framework,django-views,django-serializer,Django,Django Models,Django Rest Framework,Django Views,Django Serializer,我正在开发一个用户上传文件的应用程序。用户选择要将文件分配给的“项目”。每个项目分配一个“用户”和一个“编辑”。上传文件时,我试图根据“项目”中的“用户”设置文件的所有者 项目模型: class Project(models.Model): projectCode = models.CharField(max_length=10) projectName = models.CharField(max_length=100) user = models.ForeignKey

我正在开发一个用户上传文件的应用程序。用户选择要将文件分配给的“项目”。每个项目分配一个“用户”和一个“编辑”。上传文件时,我试图根据“项目”中的“用户”设置文件的所有者

项目模型:

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}"
正在上载的文件的模型:

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.SET_DEFAULT, default=1)
    uploadDate = models.DateTimeField(auto_now_add=True)
    editor = models.ForeignKey(
        User, related_name="editor", on_delete=models.CASCADE, null=True)

    def __str__(self):
        return f"{self.filename}"
class CompletedSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)
    owner = UserSerializer(read_only=True)
    editor = UserSerializer(read_only=True)

    class Meta:
        model = Completed
        fields = '__all__'
项目序列化程序: 阶级

已上载文件的序列化程序:

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.SET_DEFAULT, default=1)
    uploadDate = models.DateTimeField(auto_now_add=True)
    editor = models.ForeignKey(
        User, related_name="editor", on_delete=models.CASCADE, null=True)

    def __str__(self):
        return f"{self.filename}"
class CompletedSerializer(serializers.ModelSerializer):
    project = ProjectSerializer(read_only=True)
    owner = UserSerializer(read_only=True)
    editor = UserSerializer(read_only=True)

    class Meta:
        model = Completed
        fields = '__all__'
最后,上传文件的视图集:

class CompletedViewSet(viewsets.ModelViewSet):
    permission_classes = [
        permissions.IsAuthenticated
    ]

    serializer_class = CompletedSerializer

    def get_queryset(self):
        queryset = Completed.objects.all().filter(Q(project__user=self.request.user)
                                                  | Q(project__editor=self.request.user))
        return queryset

    def perform_create(self, serializer):
        serializer.save(
            editor=self.request.user
            owner=???????
        )

如何基于项目模型中的“用户”保存所有者?

您正在为视图集中的所有序列化程序设置read_only=True,这意味着关于当前上下文(关于文件更改)的信息不会被反序列化。看一看:谢谢你。也许只写或来源将为我做的把戏那里。但是我仍然不确定如何从“projects”模型中获取“user”值,并在serializer.save函数中将其设置为文件上传的“owner”。我还没有找到任何帮助我解决这个问题的文档。