2015-01-13 18 views
5

WAŻNE: To pytanie nie ma już zastosowania.Nie można utworzyć wystąpienia modelu z kluczem GenericForeignKey w migracji


W Django 1.7 migracji staram się tworzyć wpisy komentarz programowo za pomocą następującego kodu:

# -*- 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), 
    ] 

I to powoduje błąd: TypeError: 'content_object' is an invalid keyword argument for this function

Jednak ten sam kod (tj Comment(content_object=comment.booking)) działa po uruchomieniu w powłoce.

Próbowałem utworzyć pusty modelu z new = Comment() a następnie ustawić wszystkie niezbędne pola ręcznie, ale mimo że ustawione content_type i object_pk pola odpowiednio, oni content_type nie została właściwie zapisane i dostałam django.db.utils.IntegrityError: null value in column "content_type_id" violates not-null constraint

Każdy pomysł jak prawidłowo utworzyć model z ogólnym kluczem obcym w migracji? Lub jakiekolwiek obejście?

+0

można wkleić modeli? Co najmniej odpowiedni bit? Występuję w tej samej sytuacji, próbując utworzyć prosty model, który jest celem pola M2M. Sam model nie ma pola relacji. – tutuca

Odpowiedz

3

To jest problem z programem ładującym model migracji. Załadować swoje modele za pomocą domyślnego

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

Ładuje model w jakiś szczególny sposób Comment, więc niektóre funkcje, takie jak relacje generycznych nie działają.

Jest trochę hacky rozwiązanie: załadować modele jak zwykle:

from django_comments import Comment 
+2

Niestety nie jest to nawet rozwiązanie. Działa dopóki nie dodasz pola do komentarza; w tym momencie podczas migracji model zaktualizowany generuje SQL dla wersji schematu, która ma być zastosowana w późniejszej migracji. Zatem każdy długoterminowy projekt, który zawiera starszą bazę danych, nie może już stosować migracji ir – rgammans