2017-06-26 4 views
1

Ich habe ein Problem beim Speichern von Strings als Datei in meinen Django-Modellen. Wenn ich versuche, die Daten zurück zu bekommen, gibt es einen ValueError ("attribute has no file associated"). Hier die Details:ContentFile wurde nicht im Django-Modell gespeichert FileField

MODELL:

class GeojsonData(models.Model): 
dname = models.CharField(max_length=200, unique=True) 
gdata = models.FileField(upload_to='data') 
def __str__(self): 
    return self.dname 

Code, der die Daten gespeichert werden:

cf = ContentFile(stringToBeSaved) 
gj = GeojsonDatua(dname = namevar, gdata = cf) 
gj.save() 

Code, die Daten zu lesen VERSUCHT:

def readGeo(data): 
    f = GeojsonData.objects.all().get(id=data.id).gdata 
    f.open(mode ='rb') 
    geo = f.read() 
    return geo 

TRACEBACK:

File "C:\Python\Python36-32\lib\site-packages\django\core\handlers\exception.py" in inner 
    41.    response = get_response(request) 

File "C:\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "C:\Python\Python36-32\lib\site-packages\django\core\handlers\base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "C:\Python\Python36-32\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view 
    23.     return view_func(request, *args, **kwargs) 

File "C:\app\views.py" in mapa 
    80.   geostr = app.readGeo.readGeo(d) 

File "C:\app\readGeo.py" in readGeo 
    6. f.open(mode ='rb') 

File "C:\Python\Python36-32\lib\site-packages\django\db\models\fields\files.py" in open 
    80.   self._require_file() 

File "C:Python\Python36-32\lib\site-packages\django\db\models\fields\files.py" in _require_file 
    46.    raise ValueError("The '%s' attribute has no file associated with it." % self.field.name) 

Exception Type: ValueError at /app/map/1 
Exception Value: The 'gdata' attribute has no file associated with it. 

Antwort

2

Sie müssen die ContentFile als eine tatsächliche Datei speichern. Anstatt direkt auf dem Spielfeld zuweisen, sollten Sie die save Methode Feld aufrufen und übergeben es an:

gj = GeojsonDatua(dname = namevar) 
gj.gdata.save('myfilename', cf) 

Siehe the docs.

Beachten Sie auch, wenn Sie immer Ihr gdata Feld so erstellen, möchten Sie wahrscheinlich kein FileField überhaupt; Vielleicht verwenden Sie stattdessen ein TextField.

Verwandte Themen