如何在Django Rest框架中处理文件?

如何在Django Rest框架中处理文件?,django,angular,django-models,django-rest-framework,django-views,Django,Angular,Django Models,Django Rest Framework,Django Views,我正在建立一个Angular+Django项目,我需要向其中添加一些文件,我的想法是这个模型票应该会收到一些文件,比如imgs或pdf。。。我应该在模型中使用哪个字段?文件场 class Ticket (models.Model): titulo = models.CharField(max_length=100, blank=True) estagio = models.ForeignKey( Estagio, related_name='tickets', o

我正在建立一个Angular+Django项目,我需要向其中添加一些文件,我的想法是这个模型票应该会收到一些文件,比如imgs或pdf。。。我应该在模型中使用哪个字段?文件场

class Ticket (models.Model):
    titulo = models.CharField(max_length=100, blank=True)
    estagio = models.ForeignKey(
        Estagio, related_name='tickets', on_delete=models.CASCADE, null=True)
    cliente = models.ForeignKey(Cliente, on_delete=models.CASCADE, null=True)
    org = models.ForeignKey(Organizacao, on_delete=models.CASCADE, null=True)
    produto = models.ManyToManyField(Produto)
    valorestimado = models.IntegerField(null=True)
    termometro = models.CharField(max_length=100, null=True, blank=True)
    vendedor = models.ForeignKey(
        Vendedor,  on_delete=models.CASCADE, null=True)
    vendedorext = models.ManyToManyField(
        VendedorExt, related_name='leads', blank=True)
    obs = models.ManyToManyField(Obs, related_name='tickets')
    status = models.CharField(max_length=155, blank=True, default='Aberto')
    mtvperd = models.CharField(max_length=155, null=True, blank=True)
    cmtperd = models.CharField(max_length=155, null=True, blank=True)
    created = models.ForeignKey(Created, on_delete=models.CASCADE, null=True)
    updated = models.ManyToManyField(Updated)

    def __str__(self):
        return str(self.titulo)
我如何在视图中处理此img

class TicketViewSet(viewsets.ModelViewSet):

    queryset = Ticket.objects.all().order_by('-id')
    serializer_class = TicketSerializer
    authentication_classes = [TokenAuthentication]
    permission_classes = [IsAuthenticated]

    def create(self, request):
        data = request.data

        print(data['titulo'])
        print(request.user)
        print(request.headers)

        c = Created()
        c.user = request.user
        c.save()
        V = Vendedor.objects.get(id=int(data['vendedor']))
        print(V)

        T = Ticket()
        T.titulo = data['titulo']
        T.estagio = Estagio.objects.get(id=int(data['estagio']))
        T.cliente = Cliente.objects.get(id=int(data['cliente']))
        T.org = Organizacao.objects.get(id=int(data['org']))
        T.valorestimado = int(data['valorestimado'])
        T.termometro = data['termometro']
        T.vendedor = V
        T.status = 'Aberto'

        T.created = c
        T.save()
        try:
            if data['obs'].length >= 1:
                for i in data['obs']:
                    k = Obs()
                    k.texto = i
                    k.save()
                    T.obs.add(k)
                    T.save()
        except:
            k = Obs()
            k.texto = data['obs']
            k.save()
            T.obs.add(k)
            T.save()

        produtos = data['produto']
        for prod in produtos:
            T.produto.add(Produto.objects.get(id=prod))

        T.save()
        print(data)
        return JsonResponse({'message': 'Saved'})
另外,这是将文件发送到api的正确方法吗

              <form>
                <label id="thumbnail">
                  <input type="file" name="attachments[dummy][file]"  class="file_selector" multiple="multiple"/>
                </label>
                <button class="btn btn-success" (click)="formAnexo()" style="float: right;">Salvar Anexo</button>
              </form>

萨尔瓦·阿内索

抱歉,如果我错过了一些明显的东西,那是第一次使用django处理文件,您必须在视图中使用FileUploadParser。


如果您必须将多个文件附加到同一资源,则模型的文件字段将正常

,我建议您创建一个单独的表。例如,如果要将多张图片上载到票证资源,可以执行以下操作:

班级照片(models.Model):
file=models.ImageField(
上传到“照片”,
null=False,
最大长度=100
)
已创建\u at=models.DateTimeField(
auto\u now\u add=True,
db_index=True
)
类元:
排序=['-在']
然后在您的票证模型上定义:

舱单(models.Model):
照片=模型.ManyToManyField(
“app_label.Photo”,
空白=真,
相关的\u name='ticket\u照片'
)
...
为了存储照片,我会研究一个像AWS S3这样的解决方案,它非常容易设置

为了使用Angular在前端上传图片,您需要使用
FormData
API并将数据作为
multipart/form data
上传

下面是一个代码示例:

@Injectable({providedIn:'root'})
导出类MyService{
建造师(
私有http:HttpClient
) { }
postFile(路径:字符串、文件:文件、数据?:任意):可观察{
const uploadData=new FormData();
uploadData.append('file',file,file.name);
如果(数据){
Object.keys(数据).forEach(key=>{
uploadData.append(key,data[key]);
});
}
返回此。\u http.post(
路径
上传数据
);
}
}
我希望这能帮助你开始

parser_classes = (FileUploadParser,)