2011-04-06 11 views
5

A] Resumen:Usando obtener o introducir la funcionalidad de uno a muchos modelos de Django y modelforms

Usando obtener o introducir la funcionalidad de uno a muchos modelos de Django, la comprobación de si existe un registro o relación antes de añadir un nuevo uno.

B] Detalles:

1] tengo el siguiente país Django estructura del modelo (uno) a la Ciudad (muchos)

2] Estoy usando ModelForm para mostrar el formulario en la página HTML . Los formularios se pasan como valores de plantilla y los valores de plantilla se representan en la página html

3] Cuando entra la solicitud, el código extrae los datos del formulario de país y ciudad, verifica su validez y lo guarda.

C] Edición/artículo Necesito ayuda con:

1] Quiero usar la funcionalidad get_or_insert con mi país y la relación de la ciudad

2] Básicamente, quiero comprobar si existe un registro de país existente en la base de datos del país seleccionado por el usuario,

2.1] si el país existe, verifique si hay un registro de ciudad para el país seleccionado.

2.1.1] si existe el registro de la ciudad, estamos bien, no hay necesidad de añadir otro récord

2.1.2] si el registro de la ciudad no existe, crear el registro de la ciudad y asociar el país con es

2.2] si el país no existe, cree el registro del país, cree el registro de la ciudad y asocie el registro de la ciudad con el registro del país.

C] Código Extractos:

1] Modelos y formularios -

class UserReportedCountry(db.Model): 
country_name = db.StringProperty(required=True, 
          choices=['Afghanistan','Aring land Islands'] 
         ) 

class UserReportedCity(db.Model): 
    country = db.ReferenceProperty(UserReportedCountry, collection_name='cities') 
    city_name = db.StringProperty(required=True) 

class UserCountryForm(djangoforms.ModelForm): 
    class Meta: 
     model = UserReportedCountry 

class UserCityForm(djangoforms.ModelForm): 
    class Meta: 
     model = UserReportedCity 
     exclude = ('country',) 

2] código que imprime el user_country_form forms--

y son user_city_form pasado del código python como valores de plantilla

__TEMPLATE_USER_COUNTRY_FORM = 'user_country_form' 
__TEMPLATE_USER_CITY_FORM = 'user_city_form' 

def get(self): 
    template_values = { 
     self.__TEMPLATE_USER_COUNTRY_FORM: UserCountryForm(), 
     self.__TEMPLATE_USER_CITY_FORM: UserCityForm() 
    } 

    #rendering the html page and passing the template_values 
    self.response.out.write(template.render(self.__MAIN_HTML_PAGE, template_values)) 

3] código HTML fragmento que muestra los valores de la plantilla de la página HTML

<div id="userDataForm"> 
<form method="POST" action="/UserReporting"> 
<table> 
<!-- Printing the forms for users country, city --> 
    {{ user_country_form }} 
    {{ user_city_form }}  
</table> 
<input type="submit" name="submit" value= "submit"> 
</form> 
</div> 

extracto 3] Código para guardar los datos -

def post(self): 
    self.store_user_data() 
    self.redirect('/') 

#method to save users data in the models UserReportedCountry, UserReportedCity 
def store_user_data(self): 
    #getting user's country and city 
    user_reported_country = UserCountryForm(self.request.POST) 
    user_reported_city = UserCityForm(self.request.POST) 

    if (user_reported_country.is_valid() and user_reported_city.is_valid()): 
     #save the country data 
     country_entity = user_reported_country.save() 
     #save the city data, and relate county with city 
     city_entity = user_reported_city.save(commit=False) 
     city_entity.country = country_entity 
     city_entity.put() 
     return 
    else: 
     return 

Gracias por la lectura .

[editar # 1]

@ Torsten, después me dio un puntero a get_or_insert, entonces me encontré con Stackoverflow post (http://stackoverflow.com/questions/4812832/get-or-create-matching -key-y-user-python-app-engine) e implementado la funcionalidad nombre_tecla al usuario get_or_insert

código para guardar el registro se ve como sigue:

def store_user_data(self): 
    #getting user's country and city 
    user_reported_country = UserCountryForm(self.request.POST) 
    user_reported_city = UserCityForm(self.request.POST) 

    if (user_reported_country.is_valid() and user_reported_city.is_valid()): 
     #save the country and city data 
     country_record = self.store_country_data() 
     city_record = self.store_city_data(country_record) 
     return 
    else: 
     return 

def store_country_data(self): 
    user_reported_country_name = self.request.POST['country_name'] 
    key_name = self.sanitize_key_name(user_reported_country_name) 
    country_entity = UserReportedCountry.get_or_insert(key_name, country_name = user_reported_country_name) 
    country_entity.put() 
    return country_entity 

def store_city_data(self, country_record): 
    user_reported_city_name = self.request.POST['city_name'] 
    key_name = self.sanitize_key_name("%s:%s" % (country_record.country_name, str(user_reported_city_name))) 
    city_entity = UserReportedCity.get_or_insert(key_name, 
               city_name = user_reported_city_name, 
               country= country_record) 

    city_entity.put() 
    return city_entity 

def sanitize_key_name(self,key_name): 
    return re.sub(r'\s', '', key_name.lower()) 

Solicitud: por favor alguien puede hacer un código rápido revise y avíseme si estoy haciendo algo mal o haciendo s ¿Algunos errores de novato?

+0

Todas las cosas que lista como preguntas son declaraciones. ¿Cuál es tu pregunta? ¿Qué problema tienes? –

+0

Lo siento @Nick Johnson, por no ser claro. Cambié el nombre de la sección a "Problema/ítem con el que necesito ayuda", ya que la pregunta era muy detallada. – bhavesh

Respuesta

0

Uso get_or_create (el equivalente a su get_or_insert):

country, country_is_new = UserReportedCountry.objects.get_or_create(country_name=my_country_name) 
city, city_is_new = UserReportedCity.objects.get_or_create(country=country, city_name=my_city_name) 
+0

@Torsten, gracias por su respuesta. Busqué en la API del motor de la aplicación y encontré que get_or_create no es compatible con el motor de la aplicación de google. – bhavesh

+0

@Torsten, su publicación me dio un puntero a la funcionalidad get_or_insert y me encontré con la publicación del nombre clave en stackoverflow (http://stackoverflow.com/questions/4812832/get-or-create-matching-key-and-user- python-app-engine) e implementó el código señalado en la sección "EDIT # 1" de mi publicación original. ¿Puedes hacer una revisión del código y decirme si cometo algún error? – bhavesh

+0

@lance_klusener, no mencionó que desea utilizar los modelos de App Engine y su API de consulta en lugar de Django. Asumía que hablas solo de Django. Aunque debería haberlo visto de acuerdo con tus modelos. : P –

Cuestiones relacionadas