如何在Django中只保存特定字段的模型

2024-10-01 04:49:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个django服务器,它接收用户上传的文件,然后将元数据存储在本地以便进一步检索,但将文件发送到另一个服务器。所以我不想把文件存储在本地。这是我的初始模型:

class MainFile(models.Model):
    owner = models.ForeignKey(User)
    docfile = models.FileField(verbose_name= 'Enter you file', null=True)
    file_id = models.TextField(max_length=38, null=True)

    def __str__(self):
        return MainFile.file_id

class MainFileForm(forms.ModelForm):
    class Meta:
        model = MainFile
        fields = ['docfile']

我曾经实例.保存('owner','file\u id'),我得到了一个错误:“Cannot force a update in save(),without primary key”,所以我将我的模型改为:

class MainFile(models.Model):
owner = models.ForeignKey(User)
docfile = models.FileField(verbose_name= 'Enter you file', null=True)
file_id = models.TextField(max_length=38, primary_key=True, default=1)

在修改了我的模型之后,我得到了一个错误:“以下字段在此模型中不存在或者是m2m字段:file\u id”

我的观点是:

@login_required
def StoreSegments(request):
    if request.method == 'POST':
        form = MainFileForm(request.POST, request.FILES)
        if form.is_valid():
            file_id = uuid.uuid4()
            instance = form.save(commit=False)
            instance.owner = request.user
            instance.file_id = file_id
            instance.save(update_fields=['file_id', 'owner'])
            f = request.FILES['docfile']
            urls = 'http://192.168.43.6:8000/StoreSegments'
            r=requests.post(urls, files= {'segment': f}, data={'segmentID':file_id})
            form.save()
            context = {'form': form, 'message': r.status_code}
            return render(request, "StoreSegments.html", context)
    form = MainFileForm()
    return render(request, 'StoreSegments.html', context={'message': 'request.method =="get" detected',
                                             'form': form})

那么,我怎么能只保存元数据并将文件发布出去呢?你知道吗


Tags: 文件instanceformidtruemodelsrequestsave
1条回答
网友
1楼 · 发布于 2024-10-01 04:49:28

您不需要强制主键,只需要附加user对象。由于不希望将文件保存在本地,因此不需要将其作为模型的一部分。你知道吗

但您确实希望用户上载该文件,因此您确实需要将其作为表单的一部分。你知道吗

第一步是从模型中删除文件字段,并将文件上载字段添加到表单。你知道吗

我还建议您添加一些关于您的第三方处理的文件状态的元信息,但您可以稍后添加此信息作为增强功能。你知道吗

使用原始模型,您只需要一个带一个字段的标准表单:

class MainFile(models.Model):
    owner = models.ForeignKey(User)
    file_id = models.TextField(max_length=38, null=True)

    def __str__(self):
        return MainFile.file_id

class MainFileForm(forms.Form):
    docfile = forms.FileField()

以下是更新视图的方法:

from django.contrib import messages

@login_required
def StoreSegments(request):
    form = MainFileForm(request.POST or None, request.FILES or None)
    if form.is_valid():
        file_id = uuid.uuid4()
        MainFile.objects.create(owner=request.owner, file_id=file_id)
        f = request.FILES['docfile']
        urls = 'http://192.168.43.6:8000/StoreSegments'
        r=requests.post(urls, files= {'segment': f}, data={'segmentID':file_id})
        messages.info(request, r.status_code)
        return redirect("/thank-you") # You should always redirect after POST
    return render(request,
                  'StoreSegments.html',
                   context={'message': 'request.method =="get" detected',
                            'form': form})

您应该总是在成功的POST请求之后重定向(有关详细信息,请参见this article on wikipedia)。你知道吗

查看messages framework以在您的感谢页面上显示结果消息。你知道吗

相关问题 更多 >