2010-09-30 11 views
6

ok ich denke, das ist sehr einfach, aber da ich neu bei Django bin, weiß ich nicht, wie ich damit umgehen soll.Kopiere alle Felder einer Instanz eines Django-Modells

Ich muss eine Instanz eines Django-Modells kopieren. Wie erläutert here, gibt es ein Problem beim Kopieren von ManyToMany Beziehungen. Aber die Anlage "django-model-coping.diff" hat diese Funktion, denke ich. Also ich weiß es nicht - hat mein Django diese Funktion schon? Ich weiß nicht, wie ich es nennen soll. Hilfe wäre willkommen.

+0

„Ich brauche ein ganzes django-Modell kopieren“? Meinst du, klonen eine Instanz des Modells - d. H. Klonen eine Zeile in einer Datenbank. Dies ist - im Allgemeinen - eine schreckliche Idee. Warum würden Sie Datenbankzeilen klonen? Der springende Punkt des relationalen Datenmodells besteht darin, das Klonen einer Zeile unnötig zu machen. Was machst du? –

+0

yeah, dein Recht - ich muss eine Instanz eines Modells kopieren .. Ich möchte eine Instanz mit all ihren Attributen und Beziehungen zu anderen Modellen kopieren. Weißt du, ich dachte über Redundanz und so - aber für mein Problem - es ist der beste Weg, es einfach zu kopieren. – Peter

+0

@Peter: "aber für mein Problem - es ist der beste Weg, es einfach zu kopieren". Entschuldigung, aber es ist nicht. Es kann nicht sein. Sie haben "Beziehungen" in der Datenbank, die dies völlig unnötig machen. Vielleicht müssen Sie Ihr Datenmodell reparieren, bevor Sie zu weit gehen. –

Antwort

4

können Sie tun gerade folgende:

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

Auf diese Weise neue Instanz wird mit neuen id natürlich im Fall von unique Eigenschaften erstellt wird, Fehler bei der Validierung auslösen.

HINWEIS: Wie für die Funktion, die Sie erwähnt haben - es noch nicht zum Stamm hinzugefügt wird, wird der Status design decision needed ist, aber wenn Sie wissen, was Sie tun Sie das diff auf Ihre django manuell anwenden können Instanz - es heißt Patching BTW. Hier sind einige Details, wie es geht: http://ariejan.net/2007/07/03/how-to-create-and-apply-a-patch-with-subversion/.

+0

ja - ich weiß das .. aber auf diese Weise verliert es alle m2m-Beziehungen .. – Peter

+0

Ich denke, Sie könnten '__copy __()'/'__deepcopy __() hinzufügen 'Funktionen zu Ihrem Modell und speichern Sie dann die M2M-Werte. Oder vielleicht mit "Pickle" .. Ich werde versuchen, dieses Problem zu lösen - ziemlich interessant;) – bx2

+1

Problem ist, dass Sie 'durch' Tabelle auch kopieren müssen, um das neue Modell auf ein Ende zeigen, während auf das andere Ende zeigen der Beziehung .. – bx2

4

Die docs enthalten Anweisungen, wie dies zu tun ist - einschließlich, wie mit vielen zu vielen Beziehungen umzugehen.

1

Ich werde versuchen, Ihre tatsächlichen Problem zu beantworten, denn was Sie in der Frage fragen, ist ein Problem mit Ihrer vorgeschlagenen Lösung, die, wie viele darauf hingewiesen haben, nicht wirklich ideal ist.

In den Kommentaren erwähnen Sie dies:

i .. erklären werde versuchen, So haben wir 2 Modelle: User und buchen. Ein Benutzer hat ein Buch namens "Titanic" mit etwas Inhalt. Jetzt möchte ein anderer Benutzer eine Beziehung zu diesem Buch auch. Aber, der zweite Benutzer will genau das gleiche Buch, aber es sollte "Schiff wird unter" genannt werden. Ich würde das Buch kopieren und es umbenennen. - Ich weiß, ich könnte auch den Inhalt des Buches in ein anderes Modell legen - aber mein Modell ist ein bisschen komplexer.

Sieht aus wie Sie drei Dinge zu verfolgen:

  1. Benutzer
  2. ihre Bücher
  3. Einige benutzerdefinierte stellt fest, dass Nutzer über ihre "owned" Buch.

Für jede Book, speichern ihre gemeinsame Informationen, zum Beispiel:

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) 

Nun müssen Sie Buch speichern -> Benutzer Beziehung, wie ein Anwender viele Bücher haben kann, zwei Benutzer besitzen kann das gleiche Buch, mit eigenen Meta-Informationen angehängt.

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

Wenn Sie Ihre Modelle so strukturieren, können Sie wie Abfragen tun: „Wie viele Bücher hat jedes Mitglied“

  • "Was ist das beliebteste Buch?"
  • "Was ist das am wenigsten populäre Buch?"
  • "Was ist der beliebteste Autor?"
0

Es ist erwähnenswert, dass ab django 1.8 Sie UUIDFields haben können. Wenn Sie eine Modellinstanz kopieren und speichern Sie es dann die unique Einschränkung wird in dieser Spalte fehlschlagen, in dem Fall, dass Sie zu tun haben, so etwas wie:

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