如何在django中仅保存模型的某些字段

时间:2015-12-09 07:42:11

标签: python django

我有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']

我使用了instance.save('所有者',' file_id'),我收到错误:"无法在没有主键的情况下强制执行save()更新&# 34;所以我将模型改为以下:

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_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})

那么,我怎样才能保存元数据并将文件发布出去?

1 个答案:

答案 0 :(得分:0)

您不需要强制使用主键,只需附加用户对象即可。由于您不想在本地保存文件,因此您无需将其作为模型的一部分。

您确实希望用户上传文件,因此您确实需要将其作为表单的一部分。

第一步是从模型中删除文件字段,并将文件上传字段添加到表单

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

使用原始模型,您只需要一个包含一个字段的普通表单:

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以在感谢页面上显示生成的消息。