2015-01-13 69 views
5

重要提示:此問題已不再適用。無法在遷移中使用GenericForeignKey創建模型的實例


在Django 1.7遷移我嘗試以編程方式創建註釋條目下面的代碼:

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

而且會產生錯誤: TypeError: 'content_object' is an invalid keyword argument for this function

然而,同樣的代碼(即Comment(content_object=comment.booking))在shell中執行時工作。

我試圖創建一個空白模型new = Comment(),然後手動設置所有必要的字段,但即使我設置content_typeobject_pk領域。因此,他們content_type實際上並沒有保存,我收到django.db.utils.IntegrityError: null value in column "content_type_id" violates not-null constraint

任何想法如何在遷移中正確創建一個具有通用外鍵的模型?或者任何解決方法?

+0

你可以粘貼模式?至少有關位? 我遇到了相同的情況,試圖創建一個簡單的模型,這是M2M領域的目標。模型本身沒有關係領域。 – tutuca

回答

3

這是一個遷移模型加載器的問題。您可以使用默認

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

它加載在一些特殊的方式Comment模型加載你的模型,所以像一般的關係中的一些功能不起作用。

有一點哈克解決方法:將模型像往常一樣:

from django_comments import Comment 
+2

不幸的是,這甚至不是一個解決方案。它的工作原理,直到你添加一個字段評論;在遷移期間,最新日期模型會生成將在稍後遷移中應用的模式版本的SQL。因此,任何具有較舊數據庫的長期項目都不能再應用遷移 – rgammans