2016-10-05 1 views
0

Ich habe diese Serializer, die ich Test versuche:Wie ein Filefield in Django REST-Framework testen

class AttachmentSerializer(CustomModelSerializer): 
    order = serializers.PrimaryKeyRelatedField() 
    file = FileField() 

    class Meta: 
     model = Attachment 
     fields = (
      'id', 
      'order', 
      'name', 
      'file_type', 
      'file', 
      'created_at', 
     ) 

einfach Mein Test überprüft, ob es gültig ist oder nicht:

def test_serializer_create(self): 
     self.data = { 
      'order': self.order.pk, 
      'name': 'sample_name', 
      'file_type': 'image', 
      'created_at': datetime.now(), 
      'file': open(self.image_path, 'rb').read() 
     } 

     serializer = AttachmentSerializer(data=self.data) 

     self.assertTrue(serializer.is_valid()) 

Und ich bin ständig immer diese Fehlermeldung:

{'file': ['No file was submitted. Check the encoding type on the form.']} 

ich habe versucht, eine Datei in einer Reihe von verschiedenen Möglichkeiten, wie mit stringi zu erstellen O/BytesIO, Datei usw. ohne Erfolg.

Was könnte falsch sein?

+0

Sie sollten dies lesen http://www.django-rest-framework.org/api-guide/fields/#file-upload-fields. Ihre Daten müssen ordnungsgemäß geparst werden. –

Antwort

0

Die Sache ist, dass Sie eine geöffnete Datei an die APIClient/APIRequestFactory übergeben, nicht an die Ansicht selbst. Die Django-Anforderung wird die Datei in eine UploadedFile umbrechen, die Sie verwenden sollten.

+0

Ich habe versucht, SimpleUploadedFile zu verwenden, aber einen anderen Fehler: ''non_field_errors': ['Ungültige Daten']' –

+0

Nicht sicher über das, Dateien werden nicht mit regulären Wörterbüchern und es ist wahrscheinlich die View erwartet eine andere Struktur. Vielleicht möchten Sie sich die Anforderungsquelle des DRF ansehen. – Linovia

0
from django.core.files.uploadedfile import SimpleUploadedFile 
content = SimpleUploadedFile("file.txt", "filecontentstring") 
data = {'content': content} 

try smth so, denn wenn Sie Filefield Serializer den Code überprüfen - es erwartet UploadedFile, die Namen und die Größe haben sollte:

-Attribut
def to_internal_value(self, data): 
    try: 
     # `UploadedFile` objects should have name and size attributes. 
     file_name = data.name 
     file_size = data.size 
    except AttributeError: 
     self.fail('invalid') 

und StringIO oder geöffnete Datei Objekte nicht haben Größe.

Verwandte Themen