2015-01-13 8 views
5

WICHTIG: Diese Frage ist nicht mehr relevant.Erstellen einer Instanz eines Modells mit GenericForeignKey bei der Migration


In einer Migration Django 1.7 Ich versuche Kommentar Einträge programmatisch mit dem folgenden Code zu erstellen:

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 
from django.db import models, migrations 

class Migration(migrations.Migration): 

    def create_genericcomment_from_bookingcomment(apps, schema_editor): 

     BookingComment = apps.get_model('booking', 'BookingComment') 
     Comment = apps.get_model('django_comments', 'Comment') 
     for comment in BookingComment.objects.all(): 
      new = Comment(content_object=comment.booking) 
      new.save() 

    dependencies = [ 
     ('comments', '0001_initial'), 
     ('django_comments', '__first__'), 
    ] 

    operations = [ 
     migrations.RunPython(create_genericcomment_from_bookingcomment), 
    ] 

Und es erzeugt einen Fehler: TypeError: 'content_object' is an invalid keyword argument for this function

jedoch den gleichen Code (dh Comment(content_object=comment.booking)) funktioniert, wenn in der Shell ausgeführt wird.

Ich habe versucht, ein leeres Modell mit new = Comment() zu erstellen und dann alle notwendigen Felder manuell einstellen, aber auch wenn ich content_type und object_pk Felder entsprechend gesetzt, sie content_type nicht tatsächlich gespeichert wurde, und ich erhielt django.db.utils.IntegrityError: null value in column "content_type_id" violates not-null constraint

Jede Idee, wie man Erstellen Sie ordnungsgemäß ein Modell mit einem generischen Fremdschlüssel in einer Migration? Oder irgendeine Abhilfe?

+0

Können Sie die Modelle einfügen? Zumindest das relevante Bit? Ich stoße in die gleiche Situation, versuche ein einfaches Modell zu erstellen, das das Ziel eines M2M-Feldes ist. Das Modell selbst hat kein Beziehungsfeld. – tutuca

Antwort

3

Dies ist ein Problem beim Ladeprogramm für Migrationen. Sie laden Ihre Modelle standardmäßig mit

Comment = apps.get_model('django_comments', 'Comment') 

Es lädt das Comment Modell in besonderer Weise, so dass einige Funktionen wie generische Beziehungen funktionieren nicht.

Es ist ein bisschen hacky Lösung: Laden Sie Ihre Modelle wie gewohnt:

from django_comments import Comment 
+2

Leider ist das nicht einmal eine Lösung. Es funktioniert, bis Sie ein Feld zu Kommentar hinzufügen; An diesem Punkt während der Migration generiert das aktuelle Modell SQL für die Schemaversion, die in einer späteren Migration angewendet werden soll. Daher kann jedes Langzeitprojekt, bei dem eine ältere Datenbank vorhanden ist, keine Migrationen mehr durchführen – rgammans

Verwandte Themen