2010-09-30 24 views
6

ok, creo que esto es muy básico, pero como soy nuevo en Django no sé cómo manejarlo.Copie todos los campos de una instancia de modelo django

Necesito copiar una instancia de un django-modelo. Como se explica en here, hay un problema con la copia de muchas relaciones ManyToMany. Pero el archivo adjunto "django-model-copiando.diff" tiene esa función, supongo. Entonces no sé - ¿mi Django ya tiene esa función? No sé cómo llamarlo. Ayuda sería apreciada.

+0

"Tengo que copiar en su conjunto django-modelo"? ¿Quiere decir clonar una instancia del modelo, es decir, clonar una fila en una base de datos? Esto es, generalmente, una idea terrible. ¿Por qué estarías clonando filas de bases de datos? El objetivo del modelo de datos relacional es hacer que la clonación sea innecesaria. ¿Qué estás haciendo? –

+0

Sí, tiene razón, necesito copiar una instancia de un modelo ... Quiero copiar una instancia con todos sus atributos y relaciones con otros modelos ... Ya sabes, pensé en la redundancia y esas cosas, pero para mi problema, es la mejor manera de copiarlo. – Peter

+0

@Peter: "pero para mi problema, es la mejor manera de copiarlo". Lo siento, pero no lo es. No puede ser. Usted tiene "relaciones" en la base de datos que lo hacen completamente innecesario. Quizás necesite arreglar su modelo de datos antes de ir demasiado lejos en este camino. –

Respuesta

4

Usted sólo puede hacer lo siguiente:

m = MyModel.objects.get(pk=1) 
m.id = None 
m.save() 

De esa manera nueva instancia se creará con el nuevo id, por supuesto, en caso de cualquier unique propiedades se activará errores durante la validación.

NOTA: En cuanto a la función que usted ha mencionado - que aún no se añade al tronco, el estado es design decision needed, pero si usted sabe lo que está haciendo puede aplicar manualmente el diff a su Django instancia - se llama parche por cierto. Aquí hay algunos detalles sobre cómo hacerlo: http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion/.

+0

Sí, lo sé ... pero de esta manera pierde todas las relaciones m2m .. – Peter

+0

Supongo que podría agregar '__copy __()'/'__deepcopy __() 'funciones a su modelo y luego guarde los valores m2m. O tal vez usando 'pickle'. Trataré de resolver esto, bastante interesante;) – bx2

+1

El problema es que también tiene que copiar la tabla 'through', para apuntar el nuevo modelo en un extremo mientras apunta al otro extremo de la relación .. – bx2

4

El docs incluye instrucciones sobre cómo hacerlo, incluida la forma de manejar muchas relaciones.

1

Voy a tratar de responder a su problema real, porque lo que está preguntando en la pregunta es un problema con la solución propuesta, que como muchos han señalado no es realmente ideal.

En los comentarios que mencionar esto:

Voy a tratar de explicar .. Así tenemos 2 modelos: usuario y libro. Un usuario tiene un libro llamado "Titanic" con cierto contenido. Ahora, otro usuario quiere una relación con ese libro también. Pero, el segundo usuario quiere exactamente el mismo libro , pero debería llamarse "Barco se está yendo por debajo". Copiaría el libro , y lo cambiaría de nombre. - Lo sé, también podría poner el contenido del libro en otro modelo, pero mi modelo es un poco más complejo.

Parece que tienes tres cosas a la pista:

  1. Usuarios
  2. sus libros
  3. Algunas notas a medida que los usuarios tienen sobre su libro "propiedad".

Para cada Book, almacenar su información común, por ejemplo:

class Author(models.Model): 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 

    def __unicode__(self): 
     return unicode(self.name) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.ManyToMany(Author) 
    isbn = models.CharField(max_length=13) 
    # and so on 

    def __unicode__(self): 
     return unicode(self.title) 

Ahora, es necesario almacenar libro -> relación del usuario, como por ejemplo un usuario puede tener muchos libros, dos usuarios pueden poseer el mismo libro, con su propia metainformación adjunta.

class BookClub(models.Model): 
    username = models.ForeignKey(User) 
    book = models.ForeignKey(Book) 
    comments = models.TextField() 

Si estructurar sus modelos así, usted será capaz de hacer preguntas como: "¿Cuántos libros tiene cada miembro"

  • "¿Cuál es el libro más popular?"
  • "¿Cuál es el libro menos popular?"
  • "¿Cuál es el autor más popular?"
0

Vale la pena señalar que a partir de django 1.8 puede tener UUIDFields. Si copia una instancia de modelo y luego guarda la restricción unique fallará en esta columna, en cuyo caso hay que hacer algo como:

import uuid 
m = MyModel.objects.get(pk=1) 
m.pk = None 
m.uuid = uuid.uuid4() //generate new uuid 
m.save() 
Cuestiones relacionadas