2011-02-17 19 views
7

en mi model.pyDjango ahorrar modelo ForeignKey relación

class Layer(models.Model): 
    user = models.IntegerField() 
    name = models 
    ... 

class Point(models.Model): 
    layers = models.ForeignKey(Layer) 
    meta = models.TextField() 
    ... 

en mi view.py

def datasave(request, id): 
    mid = request.POST.get("layerid",default = "") 
    metas = request.POST.get("meta",default = "") 

    cs = Point() 
    cs.layers = mid 
    cs.meta = metas 
    cs.save() 

pero da un error en mi Django debug..in mi proyecto yo uso geodjango, openlayers y extjs ... no encontré ninguna solución sobre guardando mi publicación

no hice ninguna relación con mi clave externa ... básicamente quiero hacer una capa que cuando quiero agregar un punto en mi capa, quiero guardar mi punto con la identificación de la capa ...

Respuesta

8

Es útil publicar la trazabilidad para ayudar a entender su problema (para futuras preguntas).

Me parece que está pasando un número al instancia del atributo que causaría un ValueError. El único lugar donde puede pasar un número a un campo de clave externa es en un formulario django que hace la búsqueda por usted.

En su lugar, debe asignar una instancia real de Layer.

cs = Point() 
cs.layers = Layer.objects.get(id=mid) 
cs.meta = metas 
cs.save() 
+0

pide ayuda, pero cuando hice su solución dio "featureadd() toma exactamente 2 argumentos (1 dado)" ¿cómo puedo solucionar esto? – aragon

+0

Mi 1 cambio de línea no causaría ese error. Sin embargo, ¡podría publicar el rastreo para obtener más ayuda! –

+0

no sé qué significa traceback ... cómo puedo tomar este – aragon

13

Una manera más eficiente consiste en especificar la clave externa mediante la adición de un "_id" al final, de esta manera:

cs = Point(layers_id = mid, meta = metas) 
cs.save() 

NO hacer capas XXX.objects.get = (id = ###) porque eso duplica la cantidad de consultas a la base de datos.

TAMBIÉN ... no está limpiando sus datos de POST aquí, lo cual es bastante peligroso. Obténgalo así:

from django import forms 
id_field = forms.IntegerField() 
layer_id = id_field.clean(request.POST.get("layerId", "") 
+0

Esto debería ser aceptado responder – Dejell

Cuestiones relacionadas