¿Es posible crear un modelo DJANGO con funciones variables como un atributo (que se pasa en a través de __init__ o algún método)? -- python campo con django campo con database camp Relacionados El problema

Is it possible to create a Django model w/ variable functions as an attribute (passed in either via __init__ or some method)?


0
vote

problema

Español

Estoy creando una aplicación. Eso generará problemas de matemáticas. Son problemas específicos donde se pueden alterar algunos parámetros. Cada problema será diferente y requerirá un método diferente para resolver (todos los cuales se implementarán programáticamente).

Por ejemplo: modelos.py

  import random from django.db import models  class Problem(models.Model):     unformattedText = models.TextField()      def __init__(self, unformattedText, genFunction, *args, **kwargs):         super(Problem, self).__init__(*args, **kwargs)         self.unformatedText = unformattedText         self.genFunction = genFunction      def genQAPair():         self.genFunction(self.unformattedText)   

vers.py

  def genP1(text):     num_1 = random.randrange(0, 100)     num_2 = random.randrange(0, 100)     text.format((num_1, num_2))     return {'question':text, 'answer':num_1 - num_2}  def genP2(text, lim=4):     num_1 = random.randrange(0, lim)     text.format(num_1)     return {'question':text, 'answer':num_1*40}   p1 = Problem(         unformattedText='Sally has {} apples. Frank takes {}. How many apples does Sally have?',         genFunction=genP1 ) p1.save()  p2 = Problem(         unformattedText='John jumps {} feet into the air. How long does it take for him to age?',         genFunction=genP2 ) p2.save()   

Cuando intento esto, la función no está realmente guardada. Django Simplemente guarda el entero 1 . Cuando inicie una instancia del modelo, la función está allí según lo previsto, pero aparentemente solo solo 99887776666 se guarda en la base de datos.

Pregunta de bonificación: en realidad estoy empezando a preguntarme si ni siquiera necesito modelos Django para esto. Estoy usando Django porque es super fácil obtener todo en una página web. ¿Hay una mejor manera de hacer esto? (Tal vez almacene el texto de cada problema en un archivo JSON y las funciones de generación en algún script separado).

Original en ingles

I'm creating an app. that will generate math problems. They're specific problems where some parameters can be altered. Each problem will be different, and require a different method to solve (all of which will be programatically implemented).

For example: models.py

import random from django.db import models  class Problem(models.Model):     unformattedText = models.TextField()      def __init__(self, unformattedText, genFunction, *args, **kwargs):         super(Problem, self).__init__(*args, **kwargs)         self.unformatedText = unformattedText         self.genFunction = genFunction      def genQAPair():         self.genFunction(self.unformattedText) 

views.py

def genP1(text):     num_1 = random.randrange(0, 100)     num_2 = random.randrange(0, 100)     text.format((num_1, num_2))     return {'question':text, 'answer':num_1 - num_2}  def genP2(text, lim=4):     num_1 = random.randrange(0, lim)     text.format(num_1)     return {'question':text, 'answer':num_1*40}   p1 = Problem(         unformattedText='Sally has {} apples. Frank takes {}. How many apples does Sally have?',         genFunction=genP1 ) p1.save()  p2 = Problem(         unformattedText='John jumps {} feet into the air. How long does it take for him to age?',         genFunction=genP2 ) p2.save() 

When I try this, the function isn't actually saved. Django just saves the integer 1. When I initiate an instance of the model, the function is there as intended, but apparently only 1 is saved to the database.

Bonus question: I'm actually beginning to question whether or not I even need Django models for this. I'm using Django because it's super easy to get everything onto a webpage. Is there a better way to do this? (Maybe store the text of each problem in a JSON file and the generating functions in some separate script.)

        

Lista de respuestas

0
 
vote

La capa de persistencia para una aplicación DJANGO es la base de datos, y el esquema de la base de datos está especificado por las definiciones de su modelo. En este caso, solo ha definido un solo campo en su modelo, url:4 ; No ha especificado ningún almacenamiento para la función correspondiente. Su url:5 está creando un atributo en un objeto en la memoria; no será persistido.

Hay varias formas posibles de almacenar la función. Podrías almacenarlo como texto en bruto; Podría almacenarlo como un /your-app-path/config/database.yml 16 Blob; Puede almacenar la ruta de la función y el nombre (por ejemplo, url:7 ); o hacer otra cosa. En cualquier caso, deberá crear un campo de base de datos para esa información.

Aquí hay un contorno aproximado de una solución de ejemplo utilizando la ruta de la función:

modelos.py

  url:8  

vers.py

  url:9  

Solo usted puede determinar si necesita usar una base de datos en absoluto. Si solo tiene algunas preguntas fijas, entonces podría hacerlo todo en un archivo de Python y hacerlo con él. Pero hay ventajas para usar los modelos de Django, incluida la capacidad de usar el administrador.

 

The persistence layer for a Django application is the database, and the database schema is specified by your model definitions. In this case you've only defined a single field in your model, unformattedText; you haven't specified any storage for the corresponding function. Your self.genFunction = genFunction is just creating an attribute on an object in memory; it won't be persisted.

There are various possible ways to store the function. You could store it as raw text; you could store it as a pickle blob; you could store the function path and name (e.g. "my.path.to.problems.genP1"); or do something else. In any case, you'll need to create a database field for that information.

Here is a rough outline of an example solution using the function path:

models.py

class Problem(models.Model):     unformattedText = models.TextField()     genPath = models.TextField() 

views.py

import importlib  def problem_view(request, problem_id):     problem = Problem.objects.get(id=problem_id)     gen_path, gen_name = problem.genPath.rsplit(".", 1)     gen_module = importlib.import_module(gen_path)     gen_function = getattr(gen_module, gen_name)      context = gen_function(problem.unformattedText)     return render(request, 'template.html', context) 

Only you can determine if you need to use a database at all. If you only have a few fixed questions then you could just stuff everything into a Python file and be done with it. But there are advantages to using Django's models, including the ability to use the admin.

 
 
0
 
vote

Hay un par de opciones, dependiendo de la tarea real. Los varié a partir de la opción más segura para los más peligrosos (pero flexibles):

1. Identificadores de la función de la tienda:

Puede almacenar genP1 y genP2 como 'genP1' y 'genP2' - es decir, por nombre (o puede usar Cualquier otro identificador único).

PROS:

  1. Puede validar la entrada del usuario y ejecutar solo el código de confianza, porque en este caso controla casi todo.
  2. Puede depurar fácilmente sus funciones, porque son parte de su sistema.

Contras:

  1. Necesitas definir todas tus funciones en el código. Eso significa que si desea agregar una nueva función, debe redistribuir su solicitud.
  2. Si está almacenando nombres de funciones, debe importar manualmente el módulo (o el paquete) con las funciones y llamarlos.
  3. Si está almacenando identificadores, debe definir un mapeo {identifier: path to actual function} .

2. Usa DSL

Puede escribir su propio DSL (o usar existentes)

PROS:

  1. Puede agregar nuevas funciones en tiempo de ejecución sin redistribuir la aplicación.
  2. Puede controlar qué código puede ejecutar el usuario.
  3. Puede ver el código fuente para sus funciones.

Contras:

  1. Es difícil escribir DSL seguro y flexible, especialmente si desea llamar al código de Python.
  2. Es difícil depurar funciones enormes.

3. Serializándolos

Puede serializar las funciones usando Pickle

PROS:

  1. Puede agregar nuevas funciones en tiempo de ejecución sin redistribuir la aplicación.
  2. más fácil que escribir DSL propio.

Contras:

  1. inseguro - No debe ejecutar el código no confiable. Si permite a los usuarios crear sus propias funciones, la serialización no es su forma, definir (o usar existente) DSL segura en su lugar.
  2. Es posible que sea imposible mostrar código de Python de origen para la función serializada. Para obtener más información: ¿Cómo puedo obtener la fuente? Código de una función de Python?
  3. Es difícil depurar funciones enormes.

4. Simplemente almacene el código real de Python

Solo almacene el código fuente de Python en el DB como una cadena.

PROS:

  1. Puede agregar nuevas funciones en tiempo de ejecución sin redistribuir la aplicación.
  2. Puede ver el código fuente sin ningún procesamiento adicional.
  3. más fácil que escribir DSL propio.

Contras:

  1. inseguro - No debe ejecutar el código no confiable. Si permite a los usuarios crear sus propias funciones, el almacenamiento del código fuente no es su manera, definir (o usar existente) DSL segura en su lugar.
  2. Es difícil depurar funciones enormes.
 

There are a couple of options, depending on the actual task. I ranged them starting with the most safe option to the most dangerous (but flexible):

1. Store function identifiers:

You can store genP1 and genP2 as 'genP1' and 'genP2' - i.e. by name (or you can use any other unique identifier).

Pros:

  1. You can validate user input and execute trusted code only, because in this case you control almost everything.
  2. You can easily debug your functions, because they are part of your system.

Cons:

  1. You need to define all your functions in the code. That means if you want to add new function, you need to redeploy your application.
  2. If you are storing function names, you need to manually import module (or package) with the functions and call them.
  3. If you are storing identifiers, you need to define a mapping {identifier: path to actual function}.

2. Use DSL

You can write your own DSL (or use existing)

Pros:

  1. You can add new functions at runtime without redeploying application.
  2. You can control which code can user execute.
  3. You can see source code for your functions.

Cons:

  1. It is hard to write safe and flexible DSL, especially if you want to call some python code from it.
  2. It is hard to debug huge functions.

3. Serialize them

You can serialize functions using pickle

Pros:

  1. You can add new functions at runtime without redeploying application.
  2. Easier than writing own DSL.

Cons:

  1. Unsafe - you must not execute untrusted code. If you allow users to create their own functions, serialization is not your way - define (or use existing) safe DSL instead.
  2. It might be impossible to show source python code for the serialized function. For more information: How can I get the source code of a Python function?
  3. It is hard to debug huge functions.

4. Just store actual Python code

Just store the python source code in the DB as a string.

Pros:

  1. You can add new functions at runtime without redeploying application.
  2. You can see source code without any additional processing.
  3. Easier than writing own DSL.

Cons:

  1. Unsafe - you must not execute untrusted code. If you allow users to create their own functions, storing source code is not your way - define (or use existing) safe DSL instead.
  2. It is hard to debug huge functions.
 
 

Relacionados problema

177  Tirar un error en un gatillo MySQL  ( Throw an error in a mysql trigger ) 
Si tengo un M_PI3 M_PI4 en una tabla, ¿cómo puedo lanzar un error que evita la actualización en esa tabla? ...

36  Conjuntos de datos XSD e ignorando las llaves extranjeras  ( Xsd datasets and ignoring foreign keys ) 
Tengo una configuración de tabla bastante estándar en una aplicación actual utilizando la .NET xsd DataSet y TableAdapter Características. MI contrac...

125  ¿Hay un sistema de control de versiones para los cambios de la estructura de la base de datos?  ( Is there a version control system for database structure changes ) 
A menudo me encuentro con el siguiente problema. Trabajo en algunos cambios en un proyecto que requiere nuevas tablas o columnas en la base de datos. Hago l...

35  Conecte PHP a IBM I (AS / 400)  ( Connect php to ibm i as 400 ) 
Tengo un próximo proyecto en el que necesitaré conectar nuestro sitio web ( PHP5/Apache 1.3/OpenBSD 4.1 ) a nuestro sistema de back-end que se ejecuta en un i...

191  Datos binarios en MySQL [CERRADO]  ( Binary data in mysql ) 
cerrado . Esta pregunta debe ser más enfocado . Actualmente no está aceptando respuestas. ...

321  Base de datos de SQL Server de versiones  ( Versioning sql server database ) 
Quiero obtener mis bases de datos en Control de versión. ¿Alguien tiene algún consejo o artículos recomendados para comenzar? Siempre querré tener al menos ...

40  Cree una base de datos SQLite basada en un conjunto de datos XSD  ( Create a sqlite database based on an xsd data set ) 
¿Alguien sabe si hay una manera de crear una base de datos SQLite en función de un XSD DataSet6 ? En el pasado, acabo de usar un administrador de SQLite bási...

50  CX_ORACE: ¿Cómo lo hago en un conjunto de resultados?  ( Cx oracle how do i iterate over a result set ) 
Hay varias formas de iterar sobre un conjunto de resultados. ¿Cuál es la compensación de cada uno? ...

62  Cambie los valores de columna indexados únicos en la base de datos  ( Swap unique indexed column values in database ) 
Tengo una tabla de base de datos y uno de los campos (no la clave principal) está teniendo un índice único en él. Ahora quiero intercambiar valores debajo de ...

126  Bases de datos de archivos planos [cerrados]  ( Flat file databases ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. ¿...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos