python tipos - ¿Cómo uso un diccionario para actualizar los campos en los modelos de Django?





models example (4)


Aquí hay un ejemplo de crear utilizando su diccionario d:

Book.objects.create(**d)

Para actualizar un modelo existente, deberá usar el método de filter QuerySet. Suponiendo que conoce el pk del libro que desea actualizar:

Book.objects.filter(pk=pk).update(**d)

Supongamos que tengo un modelo como este:

class Book(models.Model):
    num_pages = ...
    author = ...
    date = ...

¿Puedo crear un diccionario y luego insertar o actualizar el modelo?

d = {"num_pages":40, author:"Jack", date:"3324"}



Si sabes que quieres crearlo:

Book.objects.create(**d)

Suponiendo que necesita verificar una instancia existente, puede encontrarla con get o create:

instance, created = Book.objects.get_or_create(slug=slug, defaults=d)
if not created:
    for attr, value in d.iteritems(): 
        setattr(instance, attr, value)
    instance.save()

Como mencioné en otra respuesta, también puede usar la función de update en el administrador de conjuntos de consultas, pero creo que no enviará ninguna señal (lo cual puede no importarle si no los está usando). Sin embargo, probablemente no deberías usarlo para alterar un solo objeto:

Book.objects.filter(id=id).update()






Aunque siempre recomiendo usar tryy exceptdeclaraciones, aquí hay algunas posibilidades para ti (mi favorito personal está usando os.access):

  1. Intenta abrir el archivo:

    Abrir el archivo siempre verificará la existencia del archivo. Puedes hacer una función así:

    def File_Existence(filepath):
        f = open(filepath)
        return True
    

    Si es False, detendrá la ejecución con un IOError u OSError no administrado en versiones posteriores de Python. Para detectar la excepción, debe usar una cláusula de excepción de prueba. Por supuesto, siempre se puede usar una trydeclaración de excepción (" hsandt ") (gracias a hsandt por hacerme pensar):

    def File_Existence(filepath):
        try:
            f = open(filepath)
        except IOError, OSError: # Note OSError is for later versions of Python
            return False
    
        return True
    
  2. Uso os.path.exists(path):

    Esto comprobará la existencia de lo que especifique. Sin embargo, comprueba los archivos y directorios, así que ten cuidado con la forma en que lo usas.

    import os.path
    >>> os.path.exists("this/is/a/directory")
    True
    >>> os.path.exists("this/is/a/file.txt")
    True
    >>> os.path.exists("not/a/directory")
    False
    
  3. Uso os.access(path, mode):

    Esto comprobará si tienes acceso al archivo. Se comprobará los permisos. Sobre la base de la documentación de os.py, al escribir os.F_OK, comprobará la existencia de la ruta. Sin embargo, usar esto creará un agujero de seguridad, ya que alguien puede atacar su archivo usando el tiempo entre la verificación de los permisos y la apertura del archivo. En su lugar, debería ir directamente a abrir el archivo en lugar de verificar sus permisos. ( EAFP vs LBYP ). Si no va a abrir el archivo más tarde y solo está verificando su existencia, puede usar esto.

    De todos modos, aquí:

    >>> import os
    >>> os.access("/is/a/file.txt", os.F_OK)
    True
    

También debo mencionar que hay dos formas en las que no podrá verificar la existencia de un archivo. O bien el tema será permission deniedo no such file or directory. Si encuentra una IOError, establezca IOError as e(como mi primera opción) y luego ingrese print(e.args)para que pueda determinar su problema. ¡Espero que ayude! :)





python database django